Swap

機器在重負載下到達交換空間後凍結

  • November 27, 2018

我的機器遇到了幾次崩潰。同時,當我啟動一個填滿所有記憶體的程序時,我可以重現它。一旦系統開始寫入交換文件,系統就會凍結,我必須重新啟動。

在日誌中,我在崩潰前沒有看到有用的日誌資訊,例如:

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"

經過一些實驗,我可以確認它實際上是與一個巨大的交換分區(16 GB)結合在一起的。

感謝 Otheus 和 cas 的評論,您的直覺是正確的。我低估了效果。可能是因為我以前使用的機器的交換空間更小(與記憶體相比),所以最終耗盡記憶體的程序被殺死了。

作為一些安全措施,我將減少系統上的最大交換空間。我還定義了每個程序的限制,以防止單個程序炸毀記憶體:

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

像這樣的工具vmstat 1可以幫助分析問題。

引用自:https://unix.stackexchange.com/questions/271765