当前位置:首页 > 嵌入式 > Linux阅码场
[导读]一天,有人报上了一个问题,发现一台服务器上空闲内存不足,slab占用了40多G,想知道什么原因,然后拉我进入在线会议远程看看。我进入会议常规检测一番,于是想看看哪个slab占用内存比较多,直接上小脚本:whilesleep1;docat/proc/slabinfo|awk'{na...

一天,有人报上了一个问题,发现一台服务器上空闲内存不足,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---



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭