Skip to content

服务器内存使用率过高 原创

✍ 道路千万条,安全第一条。操作不规范,运维两行泪。

问题

收到服务器内存使用率较高的告警,告警信息如下:

b6df5ff89b6e32d751c1d32bb4f97181 MD5

排查

这个节点是 K8S 集群的 Master 节点,按道理不应该存在占用较高内存的应用存在。

(1)使用 top 命令查看服务器的资源情况,整体占用都不高。

0e1b970c9fcc094929c9363e0abe2a32 MD5

(2)使用 free -h ,发现共享内存占用异常高。

6e61c01aaa3f36d7b6514cc19d9fa7cf MD5

共享内存占用较高,可能由以下原因:

  1. tmpfs文件系统过大
bash
# 检查tmpfs挂载点
df -h | grep tmpfs

# 检查/dev/shm(默认tmpfs)
du -sh /dev/shm 2>/dev/null
ls -la /dev/shm/
  1. 大量进程间通信
shell
# 检查使用共享内存的进程
ipcs -m

# 查看共享内存段详情
ipcs -m -p
  1. Docker/容器内存问题
shell
# 如果使用Docker,检查容器
docker ps
docker stats --no-stream

# 检查Docker shm大小
docker inspect <container_id> | grep ShmSize

(3)通过 df -h | grep tmpfs 排查挂载点,发现把 /dev 用完了,这大概发现问题根源了。

3d63f6098c4b6af11d80d7f5f2aa50b0 MD5

(4)通过 du -sh /dev/* 2>/dev/null | sort -hr | head -10 查看目录中的大文件。

8614609b3f0ce2145f3169350bbd4eed MD5

这就发现了异常大文件,这个文件大概率是 XX 上传的。

查看图片生成的时间是 7月22号下午14:34

ab9cc27d4317957f9a91d1d85f6d8a28 MD5

通过 history 发现这个时间段有用户进来操作过。

a8e50b488d5575d3126b5963dfdccbea MD5

这里看不到做了什么,猜测是通过类似 xshell 这样的客户端上传的文件,所以在 history 中找不到记录。

解决

这种解决方案也很简单,把这个文件移出去就可以了。

dca5e114db2423ff1e12dfd924e010fd MD5 移出去过去,所有一切都恢复正常了。

88532a612ef37225181ef66e31c075a8 MD5

ee58b265ab63c6d0f24202eff4362369 MD5

22d14cdd318716d478e5b035ba53fad1 MD5

其他解决方案

1. 清理共享内存

shell
# 清理未使用的共享内存段(谨慎操作)
ipcs -m | awk '$6==0 {print $2}' | xargs -I {} ipcrm -m {} 2>/dev/null

2. 重启相关服务

bash
# 重启可能使用大量共享内存的服务
systemctl restart docker  # 如果使用Docker
# 或重启其他相关服务

3. 临时释放缓存

shell
# 释放页面缓存(临时缓解)
sync && echo 1 > /proc/sys/vm/drop_caches
最近更新