Swap
機器在重負載下到達交換空間後凍結
我的機器遇到了幾次崩潰。同時,當我啟動一個填滿所有記憶體的程序時,我可以重現它。一旦系統開始寫入交換文件,系統就會凍結,我必須重新啟動。
在日誌中,我在崩潰前沒有看到有用的日誌資訊,例如:
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
可以幫助分析問題。