
本文转载自微信公众号「码农桃花源」,大量作者峰云就她了。大量转载本文请联系码农桃花源公众号。大量
通过grafana监控面板,大量发现了几个高频的大量业务缓存节点出现了大量的fin-wait2,而且fin-wait2状态持续了不短的大量时间。通过连接的大量ip地址和抓包数据判断出对端的业务。除此之外,大量频繁地去创建新连接,大量我们对golang net/http transport的大量连接池已优化过,但established已建连的大量连接没有得到复用。
另外,大量随之带来的大量问题是大量time-wait的出现,毕竟fin-wait2在拿到对端fin后会转变为time-wait状态。大量但该状态是大量正常的。高防服务器
通过分析业务日志发现了大量的接口超时问题,连接的地址跟netstat中fin-wait2目的地址是一致的。那么问题已经明确了,当http的请求触发超时,定时器对连接对象进行了关闭。这边都close了,那么连接自然无法复用,所以就需要创建新连接,但由于对端的API接口出现逻辑阻塞,自然就又触发了超时,continue。
// xiaorui.cc Get "http://xxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers) Get "http://xxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers) Get "http://xxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers)通过strace追踪socket的系统调用,发现golang的socket读写超时没有使用setsockopt so_sndtimeo so_revtimeo参数。
[pid 34262] epoll_ctl(3, EPOLL_CTL_ADD, 6, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=1310076696, u64=140244877192984}}) = 0 [pid 34265] epoll_pwait(3, <unfinished ...> [pid 34262] <... getsockname resumed>{sa_family=AF_INET, sin_port=htons(45242), sin_addr=inet_addr("127.0.0.1")}, [112->16]) = 0 [pid 34264] epoll_pwait(3, <unfinished ...> [pid 34262] setsockopt(6, SOL_TCP, TCP_NODELAY, [1], 4 <unfinished ...> [pid 34262] setsockopt(6, SOL_SOCKET, SO_KEEPALIVE, [1], 4 <unfinished ...> [pid 34264] read(4, <unfinished ...> [pid 34262] setsockopt(6, SOL_TCP, TCP_KEEPINTVL, [30], 4 <unfinished ...>通过net/http源码可以看到socket的超时控制是通过定时器来实现的,源码下载在连接的roundTrip方法里有超时引发关闭连接的逻辑。由于http的语义不支持多路复用,所以为了规避超时后再回来的数据造成混乱,索性直接关闭连接。
当触发超时会主动关闭连接,这里涉及到了四次挥手,作为关闭方会发送fin,对端内核会回应ack,这时候客户端从fin-wait1到fin-wait2,而服务端在close-wait状态,等待触发close syscall系统调用。服务端什么时候触发close动作?需要等待net/http handler业务逻辑执行完毕。

要么加大客户端的超时时间,要么优化对端的获取数据的逻辑,总之减少超时的触发。这个问题其实跟 Go 没有关系,换成openresyt和python同样有这个问题。
网站模板
inux/Ubuntu系统用的时间久了,经常会有一些系统更新,除了一些系统补丁、工具补丁、工具升级之外,内核也经常对一些问题进行修改升级,这样就会产生一些新的内核,我们更新了新的内核后,就会自动帮我们添加到开机启动菜单选项中,那些旧的内核启动项,对于我们来说已经没有用了,可以删除,删除后可以让我们在开机的时候能快速的选择要启动的菜单项,同时也能清理出一些磁盘空间出来,小编下面就来分享如何删除多余的内核启动菜单项注意:小编的这个建议只适合于10.10之前版本的ubuntu系统,后面的11.04,11.10。。。14.04系统因为采用的默认桌面不同,所以本经验不适用,若要使用,那么请安装GNOME桌面 1、打开“应用程序”,然后在弹出菜单中点击“附件”,选择并打开“终端”,打开终端命令窗口2、在终端命令窗口中输入并执行下面的命令:uname -a,查看我们当前使用的内核,不要删除错误了,或者当我们使用的是旧内核进入系统,想删除这个内核启动项,这样也是不能删除的。只能在开机时选择别的内核启动项进入系统才能删除3、输入下面的命令,查看当前我们系统中有哪些内核启动项,同时也可以方便我们复制的操作,具体命令是:dpkg --get-selections | grep linux4、下面就开始删除内核启动项,先选择内核启动项,然后复制,这样方便操作,然后输入下面的命令:sudo apt-get remove linux-image-2.6.32.21-generic5、执行过程中会警告我们确实要执行这个操作,输入字母y,然后回车,就开始卸载旧内核了6、之后就是一些具体的卸载过程的提示,已经更新系统启动项的信息7、我们再次使用命令:dpkg --get-selections | grep linux 来查看当前的内核情况:在 linux-image-2.6.32.21-generic 后面显示deinstall,表示已经卸载了linux-headers-2.6.32.21和 linux-headers-2.6.32.21-generic是之前我们卸载的内核相关联的头文件,现在对于我们也没有用,也可以卸载了,卸载了可以帮我们清理出不少磁盘空间,具体命令是:sudo apt-get remove linux-headers-2.6.32-21sudo apt-get remove linux-headers-2.6.32-21-generic8、删除完后,再用命令:dpkg --get-selections | grep linux 查看当前内核启动选项相关信息:linux-headers-2.6.32-21 已经没有了,被删除了linux-headers-2.6.32-21-generic已经没有了,被删除了linux-image-2.6.32-21-generic 显示为deinstall,表示被卸载删除了9、 虽然在卸载旧内核的时候提示信息说已经帮我们更新了系统启动项,但为了保险起见我们执行sudo update-grub更新开机启动控制文件。
10月13日消息,Ubuntu 15.10(Wily Werewolf)即将在10月22日正式发布,目前Ubuntu 15.10已经确认达成最终内核的冻结,也就是说,今后除了一些bug修复,将不会再有相关升级。具体说来,Ubuntu 15.10进入冻结阶段后,其软件栈和内核都不会再有升级,这能够让开发者更好地进行测试,为最终发布做好准备。据悉,Ubuntu 15.10所用Linux内核为4.2版。来自Canonical的Joseph Salisburty几天前就表示:“我们即在10月8日达成Wily Werewoft内核冻结,若还有针对15.10的补丁,请尽快提交。按照内核冻结的最终期限,所有补丁需要遵守我们的SRU策略,存在错过发布的可能。”