近期发现有台线上的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

到此还要进行后续的该应用的问题排查。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐