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

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

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

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

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.

事实上,我不知道如何解决这个问题。我希望有人见过类似的东西,并能指出我正确的方向。奇怪的是,工作一段时间后,我的系统能够进行一定程度的交换(至少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   

相关部分/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

$ swapon --summary

Filename                Type        Size    Used    Priority
/dev/dm-1                               partition   16777212    0   -1

我正在运行带有 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

挂钩/etc/mkinitcpio.conf

HOOKS="base udev autodetect modconf block encrypt lvm2 resume filesystems keyboard fsck"

答案1

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

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

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

# limit memory usage to 10G per process
ulimit -Sv 10000000

像这样的工具vmstat 1可以帮助分析问题。

相关内容