为什么程序(包括 Xorg)在 RAM 不足时会关闭,但 Swap 却接近空了?

为什么程序(包括 Xorg)在 RAM 不足时会关闭,但 Swap 却接近空了?

我已经配置了一些交换并且我相信已经激活了...

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/

相关内容