一天,有人报上了一个问题,发现一台服务器上空闲内存不足,slab占用了40多G,想知道什么原因,然后拉我进入在线会议远程看看。
我进入会议常规检测一番,于是想看看哪个slab占用内存比较多,直接上小脚本:
while sleep 1; do cat /proc/slabinfo | awk '{name=$1; size=$2*$4/4096; \printf "%s %lu\n", name, size;}' | sort -n -r -k 2 | head -n 20; \ echo "--------------";done; 结果显示类似如下:
TCPv6 9347580 (单位:4K, 大约36G)
inode_cache 3519
ext3_inode_cache 3427
dentry 2285
kmem_cache 1389
sysfs_dir_cache 832
buffer_head 682
radix_tree_node 675
vm_area_struct 505
size-2048 500
task_struct 496
size-1024 464
...
可以看到TCPv6占用了36G左右, 然后会议上有个负责业务应用的妹子问,能知道是哪个进程占用的吗?
我装着不忙地喝了一口百岁山,于是派上trace_event出场:(以下操作过程中全场安静,都盯着我的键盘输出)
首先通过/proc/slabinfo 查看到TCPv6 object size=1856,然后:
cd /sys/kernel/debug/tracing/echo 'bytes_alloc==1856' >events/kmem/kmem_cache_alloc/filterecho 1 > ./options/stacktracecat ./trace
从./trace中打印出的堆栈信息和进程号,确认是他们的业务进程xxx正在干什么事(已排除内存泄漏)
这时候妹子抢占了会上所有人的讲话,笑着说:"能把history打印出来吗?",连续提醒了我三次,说想学习一下。<真是一个好学的童鞋 :-)>
这个时候本想顺道宣传一下我在阅码场发布的tracers视频课程,视频课程里面各个traces都有很详细的讲解和案例.
但是工作时间要体现一定的专业和严肃性,并没有宣传,如果她有机会能看到这篇公众号之后再去订阅会更好:-)
最后我又喝下一口百岁山, 敲下history | tail -20 之后独自退出了会议...
---end---