k8s内存一直增大(进程rss和free的使用率相差较大)问题排查
近期发现有台线上的k8s节点服务器的内存总会超过90%。
近期发现有台线上的k8s节点服务器的内存总会超过90%。
初步解决
设定迁移k8s的pod应用通过节点反亲和性
spec:
containers:
.....
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- 192.168.1.1
迁移部分应用后,内存确实降低了,但是过段时间内存又上来了。
进一步观察
free 命令查看节点的内存利用率,总内存一共32 G ,使用了29G。
通过 ps aux|awk ‘{a+=$6};END{print a}’ 计算进程内存总和,发现总共进程总和才21G,有8G的内存不在进程使用中。即使迁移迁移走部分pod释放掉部分的内存后,内存还是会涨上来。而且进程的内存的使用很稳定并没有持续的增加。
这里附上meminfo文件的详解。
mem详解
观察socket连接
在查看prometheus监控时候发现有socket_alloc达到了34万之多,而且持续增大。
查看/proc/net/socketstat 。ss -s 查看socke连接。结果就是有30多万的链接alloc并处在了closed状态。mem是328839 * 4K 大概1G多,这边虽然没有8G的大小,但是30多万的alloc肯定是异常的。
cat /proc/net/sockstat
[root@0001~]# cat /proc/net/sockstat
sockets: used 320193
#alloc为已分配的,mem是占用的内存页数,生产环境内存页大小为4K
TCP: inuse 67 orphan 1 tw 827 alloc 318263 mem 328837
UDP: inuse 11 mem 5
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
这里附上socket的一些说明 https://blog.csdn.net/qj4522/article/details/84892762
一个socket至少4K的rmem和4K的wmem,再加上一个1k的fd差不多8G多的空间。感觉就是这的问题。现在就是找到这些socket进程。
文件描述符
这里socket虽然关闭了,但是socket链接的fd是没有释放的。fd对应的是打开文件数。现在使用lsof来查看打开文件数,发现命令会卡住,一直得不到响应,应该是数据态度卡住了,无奈ctrl+c终止掉。
转换思路30多万的fd去proc下应该很容易找到
ls /proc/*/fd
发现到了21841这个进程就输出大量的fd文件。那就是这个进程了。
[root@0001 fd]# ps aux|grep 21841
root 21841 14.7 4.3 2848756 1436820 ? Ssl Sep13 5118:36 java
这个进程的rss只有1.4G,尝试重新部署该pod,部署完之后,内存下降,free和ps 内存大致相当
[root@0001 ~]# ps aux|awk '{a+=$6};END{print a}'
21269484
[root@0001 ~]# free -k
total used free shared buff/cache available
Mem: 32762520 21949648 2632040 115680 8180832 10287116
Swap: 0 0 0
到此还要进行后续的该应用的问题排查。
更多推荐
所有评论(0)