为何设置低swappiness值(10)会导致系统及应用崩溃?
首先得搞清楚vm.swappiness到底是干嘛的——它不是禁止使用swap,而是告诉内核:当内存紧张时,优先回收哪种类型的内存页。值越低(比如你设的10),内核越倾向于清理文件页缓存(比如系统缓存的邮件、桌面图标、程序安装包数据这些存在磁盘上的内容),而不愿意把**应用的运行时内存(匿名页)**交换到swap里。
你的情况刚好踩中了这个策略的坑:
桌面与后台程序依赖缓存续命:Thunderbird的邮件缓存、XFCE桌面的界面资源(主题、窗口配置)、甚至lightdm的会话数据,大多存在文件页缓存里。当你的Python程序占用大量内存(两个15G数组加上其他运行开销,可能让可用内存吃紧),内核会疯狂清理这些缓存来给Python腾空间。这时候,这些后台程序需要访问数据时,就得重新从磁盘读取——如果磁盘IO被占满(哪怕你的Python没写磁盘,大量进程同时读磁盘也会堵),这些程序会因为长时间无法响应被系统判定为“挂死”,直接崩溃。你的XFCE桌面和screen会话崩溃,本质就是窗口管理器、会话管理进程因为无法及时获取缓存里的资源,直接被系统终止了。
脚本段错误的可能原因:当内核拼命清理缓存、内存碎片化严重时,Python的内存分配器可能无法申请到连续的内存块(哪怕总内存还有剩余),导致数组操作时触发内存访问错误,也就是你遇到的段错误。
显示器错位的小插曲:XFCE崩溃时,可能没来得及正确保存你的显示器配置(因为配置文件的缓存被清了,或者进程挂死前没写入磁盘)。当你重启lightdm时,系统只能读取默认配置,所以显示器错位。而把
vm.swappiness改回60后,内核愿意用swap来承载部分匿名页,内存压力缓解,lightdm才能正常加载并保存你的显示器设置。
你说swap还有932G没用,这正是因为swappiness=10的策略:内核宁愿清缓存也不肯碰swap,结果缓存清完了还是不够,只能牺牲其他进程。反而把swappiness调高一点(比如默认的60),内核会主动把一些不常用的应用内存移到swap,给前台的Python程序和关键进程(桌面、邮件)留足够的缓存和内存,系统反而更稳定。
备注:内容来源于stack exchange,提问作者abukaj

