我的机器曾多次崩溃。同时,当我启动一个填满所有内存的程序时,我可以重现它。一旦系统开始写入交换文件,系统就会冻结,我必须重新启动。
在日志中,我在崩溃之前没有看到任何有用的日志信息,例如:
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
可以帮助分析问题。