大量close_wait以及调用ip地址错误获取方法引发的故障

记录一下这几天帮助兄弟项目组解决的几个问题

工程:网关服务器,业务逻辑少,操作不费时
问题:大量的Close_wait,访问速度较慢

分析&解决:
1、close_wait是TCP/IP协议中被动关闭方收到Fin后没有发送Fin导致
项目采用了mina框架,服务器被动关闭时会生成一个异常,调用exceptionCaught()方法,
在该方法中,服务器调用关闭方法session.close(false);false的意思是先发送数据,等数据 发送完了再关闭。通常情况下这是一个正常的流程,但是在高并发访问的情况下,可能生成大量Close_wait。如果情况允许的话,把false改成true就好了。通常情况下,改成true是没有问题的。

2、项目中获取ip的方法有问题:
  ip = ((InetSocketAddress)(session.getRemoteAddress())).getHostName();

此方法会先通过域名服务器获取远程客户段的域名,域名无法获得的情况下再获取ip,在域名服务器不稳定的情况下,通常耗时好几百毫秒。如果没有必要的话,可以将这个代码直接修改为:
	InetSocketAddress accountAddress = (InetSocketAddress) session
.getRemoteAddress();

String accountIp = accountAddress.getAddress().getHostAddress();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include "tst_test.h" #include "tst_safe_macros.h" #include "lapi/sched.h" #define MAX_TRIES 1000 static void child_func(void) { int fd, len, event_found, tries; struct sockaddr_nl sa; char buffer[4096]; struct nlmsghdr *nlh; /* child will listen to a network interface create/delete/up/down events */ memset(&sa, 0, sizeof(sa)); sa.nl_family = AF_NETLINK; sa.nl_groups = RTMGRP_LINK; fd = SAFE_SOCKET(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); SAFE_BIND(fd, (struct sockaddr *) &sa, sizeof(sa)); /* waits for parent to create an interface */ TST_CHECKPOINT_WAKE_AND_WAIT(0); /* * To get rid of "resource temporarily unavailable" errors * when testing with -i option */ tries = 0; event_found = 0; nlh = (struct nlmsghdr *) buffer; while (tries < MAX_TRIES) { len = recv(fd, nlh, sizeof(buffer), MSG_DONTWAIT); if (len > 0) { /* stop receiving only on interface create/delete event */ if (nlh->nlmsg_type == RTM_NEWLINK || nlh->nlmsg_type == RTM_DELLINK) { event_found++; break; } } usleep(10000); tries++; } SAFE_CLOSE(fd); if (event_found) tst_res(TPASS, "interface changes detected"); else tst_res(TFAIL, "failed to detect interface changes"); exit(0); } static void test_netns_netlink(void) { /* unshares the network namespace */ SAFE_UNSHARE(CLONE_NEWNET); if (SAFE_FORK() == 0) child_func(); /* wait until child opens netlink socket */ TST_CHECKPOINT_WAIT(0); /* creates TAP network interface dummy0 */ if (WEXITSTATUS(system("ip tuntap add dev dummy0 mode tap"))) tst_brk(TBROK, "adding interface failed"); /* removes previously created dummy0 device */ if (WEXITSTATUS(system("ip tuntap del mode tap dummy0"))) tst_brk(TBROK, "removing interface failed"); /* allow child to continue */ TST_CHECKPOINT_WAKE(0); tst_reap_children(); } static struct tst_test test = { .test_all = test_netns_netlink, .needs_checkpoints = 1, .needs_root = 1, .forks_child = 1, .needs_kconfigs = (const char *[]) { "CONFIG_NET_NS=y", "CONFIG_TUN", NULL }, };
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值