一天,有人報上了一個問題,發(fā)現(xiàn)一臺服務器上空閑內(nèi)存不足,slab占用了40多G,想知道什么原因,然后拉我進入在線會議遠程看看。
我進入會議常規(guī)檢測一番,于是想看看哪個slab占用內(nèi)存比較多,直接上小腳本:
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; 結(jié)果顯示類似如下:
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左右, 然后會議上有個負責業(yè)務應用的妹子問,能知道是哪個進程占用的嗎?
我裝著不忙地喝了一口百歲山,于是派上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中打印出的堆棧信息和進程號,確認是他們的業(yè)務進程xxx正在干什么事(已排除內(nèi)存泄漏)
這時候妹子搶占了會上所有人的講話,笑著說:"能把history打印出來嗎?",連續(xù)提醒了我三次,說想學習一下。<真是一個好學的童鞋 :-)>
這個時候本想順道宣傳一下我在閱碼場發(fā)布的tracers視頻課程,視頻課程里面各個traces都有很詳細的講解和案例.
但是工作時間要體現(xiàn)一定的專業(yè)和嚴肅性,并沒有宣傳,如果她有機會能看到這篇公眾號之后再去訂閱會更好:-)
最后我又喝下一口百歲山, 敲下history | tail -20 之后獨自退出了會議...
---end---