内存文件系统的再学习
背景
言出法随了.
昨天刚吐槽了 Linux会因为特殊的内存需求挤压导致Java进程宕机.今天早上七点半一个 devops 验证节点就出现了宕机.
分析宕机问题很简单.
但是根据问题学习和整理更重要和更难一些. 想着能够趁着这次自己手底下的宕机出现. 将问题再整理归纳一下.
宕机原因
七点半时, 系统压力大, 导致被OOMkiller查看方式:
sar -r 00时00分01秒 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit
06时50分02秒 403952 305152 49047800 99.18 176 2885544 54022920
07时00分01秒 349652 272956 49102100 99.29 176 2908056 53999316
07时10分03秒 409548 223676 49042204 99.17 176 2785008 54038912
07时20分03秒 321328 183412 49130424 99.35 176 2846744 54060264
07时30分02秒 31794708 32056468 17657044 35.71 172 3257904 23459236
07时40分01秒 31821648 32113984 17630104 35.65 172 3289108 23468024可以看到 0720 时 基本上到了 99.35% 的最高值.
然后可以看到 buffer 是3G左右. 然后
dmesg -T |grep -i oom-killer -A 100 http-nio-5200-P invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), nodemask=(null), order=0, oom_score_adj=0[六 5月 11 07:27:22 2024] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
[六 5月 11 07:27:22 2024] [ 715] 0 715 110443 69459 917504 0 0 systemd-journal
[六 5月 11 07:27:22 2024] [ 751] 0 751 29767 1295 237568 0 -1000 systemd-udevd
查看内存分布-1
top 然后输入大写的MPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND2726 gdm 20 0 9828400 5.1g 23504 S 0.0 10.9 3208:53 gnome-shell7133 root 20 0 17.8g 4.0g 2720 S 0.0 8.5 5:45.59 java2840 root 20 0 2086996 1.6g 2876 S 0.0 3.4 2064:10 redis-server
10195 root 20 0 2364352 418004 2992 S 0.0 0.8 6:48.30 gnome-software发现 图形化界面使用率较高.
还是的干掉.方式方法为:systemctl stop gdm.servicesystemctl disable gdm.servicesystemctl status gdm.servicesystemctl set-default multi-user.target
查看内存分布-2
df -Th 吸取 某项目的宕机原因
发现这个里面 /run 目录下面的使用量较高
然后使用 pgcacher 查看
发现有很多 journalctl 的日志记录信息
解决方法为:
journalctl --vacuum-time=1d
journalctl --vacuum-size=1G需要注意 应该也算是 CentOS的bug.
不过我不知道为啥我那么多 systemd 的日志记
需要排查一下.
pgcacher 图片
内存文件系统的再学习
df -Th |grep -v xfs |grep -v ext4
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 24G 0 24G 0% /dev
tmpfs tmpfs 24G 1.2M 24G 1% /dev/shm
tmpfs tmpfs 24G 82M 24G 1% /run
tmpfs tmpfs 24G 0 24G 0% /sys/fs/cgroup
tmpfs tmpfs 4.8G 5.7M 4.8G 1% /run/user/0然后 free -g 为total used free shared buff/cache available
Mem: 47 20 23 0 3 26
Swap: 0 0 0发现内存文件系统 不仅仅是 /tmp 目录. 比如我这个系统 /tmp 竟然不是内存文件系统
但是其他的目录 比如
/dev 目录 是 内存文件系统, 更常用的是 /dev/null
系统一般适用来处理部分驱动设备等.
/run 的话一般是很多程序存放 socket 文件用的.
放到内存文件里面速度快.
/tmp 像是tomcat 也会将 线程信息放进去. 这样处理也是速度较快.
/sys 的话 就是系统管理的内容
/proc 其实一般也是内存文件系统.
里面的东西都存在于内存. 也是速度快
free top 等统计工具都是从 /proc 里面后去信息进行展示的内存文件系统是 linux 快速出具分析结果的方式方法.
但是不能过分使用. 尤其是如果有垃圾数据进入了内存文件系统
其实会大量的占用可用内存. 导致影响正常的生产工作
需要注意.