我已经配置了一些交换并且我相信已经激活了...
Filename Type Size Used Priority
/dev/sda5 partition 7811068 1124912 200
/mnt/data02/swapfile file 134217724 37032 100
/home/swapfile file 134217724 36600 -1
但是,当系统监视器显示内存达到 100% 时,系统往往会通过关闭/崩溃程序来做出响应。Xorg 和无线驱动程序都以这种方式崩溃过。当这种情况发生时,系统监视器显示 Swap 的使用很少(低于 5 GiB)。我已确认 swappiness 未设置为极端值(并且此参数的更改似乎对问题没有影响)。
~$ cat /proc/sys/vm/swappiness
70
该系统拥有大量的 RAM...
~$ free -h
total used free shared buffers cached
Mem: 125G 20G 105G 161M 54M 1.1G
-/+ buffers/cache: 19G 106G
Swap: 263G 1.1G 262G
...但有时我的内存资源超出预算,如果它失败得比崩溃更优雅,那就太好了。
我该如何解决这个问题?
编辑
~$ cat /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda3 during installation
UUID=8dfbed62-9957-4f06-b4e1-a42020adec91 / ext4 errors=remount-ro 0 1
# /home was on /dev/sda6 during installation
UUID=b6f33408-1d8b-4302-9983-5c778ef64f47 /home ext4 defaults 0 2
# swap was on /dev/sda5 during installation
# ae0304dd-e63e-4d3a-99da-9c9d7a034c6e is the swap file
UUID=fd4c00c9-49bf-4562-adea-1c817fc57ce9 none swap sw,pri=200 0 0
UUID=3A323DCA323D8BBF /mnt/data01 ntfs-3g defaults,windows_names,locale=en_US.utf8 0 0
UUID=4cc8a19d-5991-4186-8f65-7062805b66a6 /mnt/data02 ext4 defaults 0 0
/mnt/data02/swapfile none swap sw,pri=100 0 0
/home/swapfile none swap sw 0,pri=150 0
编辑2
为了回应下面的评论,我观察了我的系统执行一个操作,我知道这个操作会使用所有可用的 RAM 但不会使用所有可用的交换空间,然后dmesg
在故障期间和之后进行了检查。系统进行了交换并变得间歇性无响应(正常行为)。然后,当交换空间不足 10% 的容量时,Chrome 崩溃了(Sorry, the program "chrome" closed unexpectedly. Your computer does not have enough free memory to automatically analyze the problem and send a report to the developers
)。尝试返回我正在观察的 dmesg 输出时,我收到一条错误消息,指出This window is not responding. Do you want to force the application to exit, or wait for it to respond
。我选择了“等待”。桌面重新出现,并且在系统进行交换时,gnome 系统监视器多次变灰。当我再次检查时,我处于 Ubuntu 登录屏幕。我正常登录...我之前运行的所有进程都消失了,并且我收到了一条错误消息,该消息与关于 Chrome 的 Xorg 错误消息相同。检查 dmesg 仅显示以下两条消息:
[131267.206774] Watchdog[3433]: segfault at 0 ip 00007fe38faf9756 sp 00007fe37f393770 error 6 in chrome[7fe38be0a000+510c000]
[133329.875212] nvidia 0000:03:00.0: irq 106 for MSI/MSI-X
编辑3 其他可能相关的主题:
- 即使仍有大量可用内存,也可能会调用 OOM 终止程序,尽管我仍然不确定如何检查是否调用了 OOM。
- 也许有些pages_low / min_free_kbytes 的配置会让我到达我需要的地方,比 swappiness 更直接相关,但我没有看到 [一些网站建议我应该在 /proc/zoneinfo 中找到什么(我无法发布链接:mariosmarduch.ulitzer.com/node/431838/mobile),但这可能是因为它们不是 Ubuntu 专用的?
- 我无法发布链接:www.linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html?page=1
编辑4 其他错误消息:
[92315.165728] Watchdog[1319]: segfault at 0 ip 00007f7d0a417756 sp 00007f7cf9cb1770 error 6 in chrome[7f7d06728000+510c000]
[92656.478271] INFO: task Chrome_IOThread:1292 blocked for more than 120 seconds.
[92656.478275] Tainted: P OX 3.13.0-45-generic #74-Ubuntu
[92656.478276] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[92656.478278] Chrome_IOThread D ffff88207fc534c0 0 1292 32756 0x00000000
[92656.478282] ffff881fa9d15dd8 0000000000000086 ffff881fad2ab000 ffff881fa9d15fd8
[92656.478285] 00000000000134c0 00000000000134c0 ffff881fad2ab000 ffff881fad2ab000
[92656.478288] ffff881f5fce6260 ffff881f5fce6268 ffffffff00000000 ffff881f5fce6270
[92656.478290] Call Trace:
[92656.478299] [<ffffffff817252d9>] schedule+0x29/0x70
[92656.478302] [<ffffffff81727f55>] rwsem_down_write_failed+0x115/0x230
[92656.478307] [<ffffffff81371d63>] call_rwsem_down_write_failed+0x13/0x20
[92656.478311] [<ffffffff81314c90>] ? apparmor_file_mprotect+0x30/0x30
[92656.478313] [<ffffffff8172796d>] ? down_write+0x2d/0x30
[92656.478318] [<ffffffff8116ba7c>] vm_mmap_pgoff+0x6c/0xc0
[92656.478322] [<ffffffff8117f916>] SyS_mmap_pgoff+0x116/0x270
[92656.478325] [<ffffffff81018802>] SyS_mmap+0x22/0x30
[92656.478328] [<ffffffff8173196d>] system_call_fastpath+0x1a/0x1f
答案1
根据它们正在执行的操作,当可用内存(常驻内存而不是交换内存)变得非常低时,具有大量内存的计算机(例如您的计算机)可能会遇到困难。有时(不确定您的情况)可以通过增加保持的最小可用内存量或 /proc/sys/vm/min_free_kbytes 来改善情况。可以将其视为保持更多可用空间,以便更容易移动、重新分组和碎片整理等。首先尝试一个非常大的数字,比如 20G,如果有帮助,请尝试减少它。您也可以通过仔细观察“空闲”来帮助自己,以尝试将问题与一些最小可用内存关联起来。
方法 1(以 sudo 身份运行脚本):
#! /bin/bash
cat /proc/sys/vm/min_free_kbytes
echo "20000000" > /proc/sys/vm/min_free_kbytes
cat /proc/sys/vm/min_free_kbytes
方法2(直接命令):
echo "20000000" | sudo tee /proc/sys/vm/min_free_kbytes
答案2
要查明您的进程是否已被 OOM 终止程序终止,您可以检查此命令的结果:
sudo egrep -ri 'killed process' /var/log/ | grep -v auth.log
如果是这种情况,您可能需要查看有关控制 OOM Killer 的文章。 http://lwn.net/Articles/317814/