问题背景
接上次的问题,一段时间后,环境再次出现harbor
和calico
因为健康检查不过反复重启的问题,并且使用kubectl
命令进入Pod也响应非常慢甚至超时。
1 | [root@node01 ~]# kubectl exec -it -n system node1-59c9475bc6-zkhq5 bash |
原因分析
反复重启的原因上次已定位,这次上环境简单看还是因为健康检查超时的问题,并且现象也一样,TCP
的连接卡在了第一次握手的SYN_SENT
阶段。
1 | [root@node01 ~]# netstat -anp|grep 23380 |
也就是说,除了TCP
连接队列的问题,还存在其他问题会导致该现象。先看看上次的参数还在不在:
1 | [root@node01 ~]# cat /etc/sysctl.conf |
再看下上次修改的参数是否生效:
1 | [root@node01 ~]# ss -lnt |
参数的修改也生效了,那为什么还会卡在SYN_SENT
阶段呢?从现有情况,看不出还有什么原因会导致该问题,只能摸索看看。
- 在问题节点和非问题节点上分别抓包,看报文交互是否存在什么异常;
- 根据参考资料[1],排查是否为相同问题;
- 根据参考资料[2],排查是否相同问题;
- …
摸索一番,没发现什么异常。回过头来想想,既然是业务下发大量配置导致的,并且影响是全局的(除了业务Pod自身,其他组件也受到了影响),说明大概率原因还是系统层面存在的性能瓶颈。业务量大的影响除了CPU、一般还有内存、磁盘、连接数等等,与开发人员确认他们的连接还是长连接,那么连接数很大的情况下会受到什么内核参数的影响呢?其中一个就是我们熟知的文件句柄数。
1 | [root@node01 ~]# lsof -p 45775 | wc -l |
嗯,打开了1w+的文件句柄数并且基本都是sock
连接,而我们使用的操作系统默认情况下每个进程的文件句柄数限制为1024,查看确认一下:
1 | [root@node01 ~]# ulimit -n |
超额使用了这么多,业务Pod竟然没有too many open files
错误:
1 | [root@node01 ~]# kubectl logs -n system node1-59c9475bc6-zkhq5 |
临时修改一下:
1 | [root@node01 ~]# ulimit -n 65535 |
再次使用kubectl
命令进入业务Pod,响应恢复正常,并且查看连接也不再有卡住的SYN_SENT
阶段:
1 | [root@node01 ~]# kubectl exec -it -n system node1-59c9475bc6-zkhq5 bash |
解决方案
- 业务根据实际情况调整文件句柄数。
- 针对业务量大的环境,强烈建议整体做一下操作系统层面的性能优化,否则,不定哪个系统参数就成了性能瓶颈,网上找了个调优案例[3],感兴趣的可以参考。