我当前的 ubuntu 系统似乎有更大的内存泄漏
在报告了奇怪的 Eclipse 内存错误(https://askubuntu.com/questions/148998/eclipse-constant-different-out-of-memory-errors)后,我今天开始在控制台中收到“内存不足”错误消息 - 而做简单的任务,比如输入sudo -s- 甚至 -free -m
重复输入“free -m”向我展示了我的 RAM 如何从 700M 快速增加到 900M,并在几秒钟内增加到 2000M 的大小(使用 释放内存后echo 3 > /proc/sys/vm/drop_caches)
Eclipse 不是原因,我完全终止了该进程,并且 ram 仍在上升。有什么方法可以检测泄漏的来源?我什至无法再更新我的系统,因为apt-get update失败(可能是因为它的内存不足)
使用 Ubuntu 11.10
小智 15
首先,确保有一个具有足够可用空间的临时文件夹。以下命令可创建大小为几 GB 的转储。
您可以使用以下命令创建一个新的 tmp 文件夹。您可能希望更改/tmp为具有足够空间的其他文件系统
TMPDIR=$(mktemp -d -t -p /tmp)
Run Code Online (Sandbox Code Playgroud)
找出导致内存泄漏的进程的PID(您也可以使用例如,htop如果可用)并将其存储在一个名为的变量中pid
ps -aux
Run Code Online (Sandbox Code Playgroud)鉴于 PID 在变量中可用pid,您可以使用 捕获内存消耗/proc/$pid/smaps并将其保存到某些文件中,例如beforeMemInc.txt.
cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
Run Code Online (Sandbox Code Playgroud)/proc/$pid/smaps再次捕获并保存为afterMemInc.txt
cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
Run Code Online (Sandbox Code Playgroud)找出 firstsmaps和 2nd之间的区别smaps,例如
diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
Run Code Online (Sandbox Code Playgroud)记下内存增加的地址范围,例如:
beforeMemInc.txt afterMemInc.txt
---------------------------------------------------
2b3289290000-2b3289343000 2b3289290000-2b3289343000 #ADDRESS
Shared_Clean: 0 kB Shared_Clean: 0 kB
Shared_Dirty: 0 kB Shared_Dirty: 0 kB
Private_Clean: 0 kB Private_Clean: 0 kB
Private_Dirty: 28 kB Private_Dirty: 36 kB
Referenced: 28 kB Referenced: 36 kB
Anonymous: 28 kB Anonymous: 36 kB #INCREASE MEM
AnonHugePages: 0 kB AnonHugePages: 0 kB
Swap: 0 kB Swap: 0 kB
KernelPageSize: 4 kB KernelPageSize: 4 kB
MMUPageSize: 4 kB MMUPageSize: 4 kB
Locked: 0 kB Locked: 0 kB
VmFlags: rd wr mr mw me ac VmFlags: rd wr mr mw me ac
Run Code Online (Sandbox Code Playgroud)使用 GDB 转储正在运行的进程的内存或使用获取核心转储
gcore -o $TMPDIR/process $PID
Run Code Online (Sandbox Code Playgroud)我在运行过程中使用 gdb 将内存转储到某个文件。
cd $TMPDIR
gdb -p $pid
dump memory memory.dump 0x2b3289290000 0x2b3289343000
Run Code Online (Sandbox Code Playgroud)现在,使用strings命令或hexdump -C打印memory.dump
strings memory.dump
Run Code Online (Sandbox Code Playgroud)
从中您可以获得可读信息,帮助您在源代码中定位这些字符串。
Emm*_*uel 11
drop_cache 技巧不会释放内存,它会重置缓存。如果要确定哪些进程使用更多内存,请使用ps命令。
例如监控前 15 名常驻内存用户的列表。
$ watch "ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16"
PID %MEM RSS VSZ COMMAND
2590 13.4 136892 825000 firefox
1743 10.7 109020 300780 Xorg
2067 8.5 86764 1118140 unity-2d-shell
3307 4.1 42560 627780 unity-2d-spread
2068 2.9 29904 617644 unity-2d-panel
2092 2.5 25524 1291204 nautilus
2457 1.9 20292 530276 gnome-terminal
2351 1.9 20016 821488 unity-scope-vid
2161 1.9 19476 531968 unity-panel-ser
2034 1.7 18256 759716 gnome-settings-
2074 1.5 16176 518016 nm-applet
2273 1.5 15452 580416 unity-lens-vide
2051 1.4 15112 524260 metacity
2395 1.2 12836 407336 update-notifi
Run Code Online (Sandbox Code Playgroud)
您还可以检查共享内存预留,但您只会知道谁是段的所有者。
Pmap分配:
$ ls -l /run/shm
total 272
-r-------- 1 ed ed 67108904 Nov 29 18:17 pulse-shm-1884617860
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-2352897759
-r-------- 1 ed ed 67108904 Nov 29 18:12 pulse-shm-3444873503
-r-------- 1 ed ed 67108904 Nov 29 18:12 pulse-shm-3485341848
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-535843976
-r-------- 1 ed ed 67108904 Nov 29 19:12 pulse-shm-789046959
-r-------- 1 ed ed 67108904 Nov 29 18:38 pulse-shm-863909656
$ df /run/shm
Filesystem 1K-blocks Used Available Use% Mounted on
none 509332 272 509060 1% /run/shm
Run Code Online (Sandbox Code Playgroud)
请注意,保留分配比实际分配的页面高得多(df 'used')
系统 V 分配:
$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 294912 ed 700 122880 2 dest
0x00000000 327681 ed 700 4823040 2 dest
0x00000000 491522 ed 600 393216 2 dest
0x00000000 589827 ed 700 4578120 2 dest
0x00000000 425988 ed 700 27852 2 dest
0x00000000 458757 ed 600 393216 2 dest
Run Code Online (Sandbox Code Playgroud)
编辑:需要通过--sort -rss以ps获得最内存使用量的过程,否则程序列表进行排序增加数值,并给出了至少内存使用的过程。
小智 5
我有一台旧机器,我使用它不断地吐出内存泄漏消息:
root@:~# free -m
total used free shared buffers cached
Mem: 1898 1523 374 131 32 588
-/+ buffers/cache: 902 995
Swap: 1942 480 1462
Run Code Online (Sandbox Code Playgroud)
我的脚本:
sync; sudo echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
命名它 cache.sh
root@~# ./cache.sh
root@~# free -m
total used free shared buffers cached
Mem: 1898 1106 791 126 1 207
-/+ buffers/cache: 897 1000
Swap: 1942 480 1462
Run Code Online (Sandbox Code Playgroud)
你可以看到我的内存降到了 374 MB,运行sync; sudo echo 3 > /proc/sys/vm/drop_caches了 417 MB。您可以cron每 5 分钟运行一次,或者只打开一个终端并在您看到性能缓慢时运行它。是的,我需要给机器添加内存...
| 归档时间: |
|
| 查看次数: |
97600 次 |
| 最近记录: |