一旦在重负载下达到交换空间,机器就会冻结

Phi*_*ßen 6 swap troubleshooting freeze

我的机器遇到了几次崩溃。同时,当我启动一个填满所有内存的程序时,我可以重现它。一旦系统开始写入交换文件,系统就会冻结,我必须重新启动。

在日志中,我没有看到崩溃前有用的日志信息,例如:

Mar 23 19:12:01 classen systemd[1]: Starting Cleanup of Temporary Directories...
Mar 23 19:12:01 classen systemd[1]: Started Cleanup of Temporary Directories.
Mar 23 19:12:08 classen wpa_supplicant[757]: wlp3s0: WPA: Group rekeying completed with ...
-- Reboot --
Mar 23 19:17:03 classen systemd-journald[380]: Runtime journal (/run/log/journal/) is 8.0M, max 796.6M, 788.6M free.
Run Code Online (Sandbox Code Playgroud)

实际上,我不知道如何解决问题。我希望有人看到过类似的东西,并能指出我正确的方向。奇怪的是,工作一段时间后,我的系统能够在一定程度上交换(至少,top表明一些交换空间被占用)。只有在交换文件负载过重的情况下才会发生冻结。


这是我的设置:

$ lsblk

NAME                    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                       8:0    0 238.5G  0 disk  
??sda1                    8:1    0   512M  0 part  /boot
??sda2                    8:2    0   238G  0 part  
  ??MyStorage           254:0    0   238G  0 crypt 
    ??MyStorage-swapvol 254:1    0    16G  0 lvm   [SWAP]
    ??MyStorage-rootvol 254:2    0   222G  0 lvm   /
sdb                       8:16   0 931.5G  0 disk  
??sdb1                    8:17   0 931.5G  0 part  
sr0                      11:0    1  1024M  0 rom   
Run Code Online (Sandbox Code Playgroud)

相关部分/etc/fstab

/dev/mapper/MyStorage-rootvol   /    btrfs   rw,noatime,ssd,autodefrag,compress=lzo,space_cache      0 0
/dev/mapper/MyStorage-swapvol none   swap    defaults        0 0

UUID=63A7-3F81          /boot        vfat    rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro    0 2
Run Code Online (Sandbox Code Playgroud)

$ swapon --summary

Filename                Type        Size    Used    Priority
/dev/dm-1                               partition   16777212    0   -1
Run Code Online (Sandbox Code Playgroud)

我正在使用 4.4.5 内核运行 Arch Linux:

$ uname -a
Linux classen 4.4.5-1-ARCH #1 SMP PREEMPT Thu Mar 10 07:38:19 CET 2016 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

挂钩/etc/mkinitcpio.conf

HOOKS="base udev autodetect modconf block encrypt lvm2 resume filesystems keyboard fsck"
Run Code Online (Sandbox Code Playgroud)

Phi*_*ßen 3

经过一些实验,我可以确认它实际上在与巨大的交换分区(16 GB)结合使用时发生了颠簸。

感谢 Otheus 和 cas 的评论,你们的直觉是正确的。我低估了效果。也许是因为我以前使用的机器的交换空间较小(与内存相比),所以最终占用内存的进程被杀死。

作为一些安全措施,我将减少系统上的最大交换空间。我还定义了每个进程的限制,以防止单个进程耗尽内存:

# limit memory usage to 10G per process
ulimit -Sv 10000000
Run Code Online (Sandbox Code Playgroud)

类似的工具vmstat 1可以帮助分析问题。