You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04.2 LTS下跨不同存储设备使用多交换文件的问题及正确用法咨询

Ubuntu 22.04.2 LTS下跨不同存储设备使用多交换文件的问题及正确用法咨询

你好,我来帮你梳理下这个问题。从你的描述来看,核心问题是跨NVMe和SATA SSD的交换文件组合会导致Jupyter崩溃,但同NVMe不同分区的交换文件正常工作,结合你的操作步骤和测试结果,我整理了几个可能的原因和对应的解决方法:


一、先排查最容易忽略的配置错误:fstab里的路径问题

你在设置第二个交换文件时,fstab里写的是~/swapfile2,这是一个典型的错误!~是Shell的用户目录别名,系统在启动时解析fstab文件时不会识别这个符号,所以这个交换文件实际上可能根本没有被自动挂载(你提到重启后第二个交换文件被停用,就是这个原因)。即使你手动用swapon ~/swapfile2能挂载,但重启后系统找不到路径,就会失效。

修复方法:

  1. 先卸载当前的第二个交换文件(如果挂载着):
    sudo swapoff ~/swapfile2
    
  2. 修改fstab里的路径为绝对路径,比如你的用户目录如果是/home/hamagust,那应该改成:
    sudo sed -i 's|~/swapfile2|/home/hamagust/swapfile2|' /etc/fstab
    
  3. 重新挂载所有交换文件验证:
    sudo swapon -a
    
  4. 用swapon --show检查两个交换文件是否都正常挂载,状态是否为active。

二、明确设置交换优先级,确保NVMe交换文件优先耗尽

虽然你提到第一个交换文件优先级更高,但默认情况下,系统会给同类型的交换文件分配相同的优先级(优先级数值越高,越优先被使用)。跨设备时,最好手动指定优先级,避免系统提前尝试使用SATA SSD的交换文件。

设置方法:

  1. 卸载当前交换文件:
    sudo swapoff /swapfile /home/hamagust/swapfile2
    
  2. 重新挂载时指定优先级(NVMe的设为更高值,比如100,SATA的设为50):
    sudo swapon -p 100 /swapfile
    sudo swapon -p 50 /home/hamagust/swapfile2
    
  3. 永久生效的话,修改fstab文件,在每个交换文件的参数后加上pri=数值:
    /swapfile none swap sw,pri=100 0 0
    /home/hamagust/swapfile2 none swap sw,pri=50 0 0
    
    这样系统会优先把数据写到NVMe的交换文件,直到它被耗尽,再开始使用SATA SSD的。

三、排查是否是OOM Killer导致的崩溃

你提到没有错误提示,Jupyter/Chrome直接关闭,这很可能是系统的OOM(Out of Memory) Killer在内存+交换不足时,主动杀掉了占用内存最多的进程(也就是你的Jupyter)。因为跨设备交换时,IO速度差异可能导致系统内存压力陡增,触发OOM。

验证方法:

查看系统日志,确认是否有OOM Killer的记录:

dmesg | grep -i oom
# 或者用journalctl查看更完整的日志
journalctl -xe | grep -i "oom-killer\|out of memory"

如果日志里显示Jupyter相关的进程被标记为“victim”并被杀死,那说明是内存/交换资源真的不够,或者系统在跨设备交换时的IO延迟导致内存无法及时释放。


四、针对跨设备交换的优化建议

即使解决了配置问题,跨NVMe和SATA SSD的交换性能差异还是可能导致系统卡顿或不稳定,这里有几个优化方向:

  1. 调整vm.swappiness参数:这个参数控制系统开始使用交换的积极程度,默认是60。如果你的内存主要被Python数据框占用,且希望尽量多用NVMe交换,可以适当调高(比如到80):
    sudo sysctl vm.swappiness=80
    # 永久生效的话,编辑/etc/sysctl.conf,添加一行:
    # vm.swappiness=80
    
  2. 优化Python代码减少内存占用:这是比依赖交换文件更根本的解决方法。比如:
    • 用pandas的chunksize参数分块读取和处理数据,避免一次性加载全量数据框。
    • 用dtype参数指定更高效的数据类型(比如把字符串列设为category,数值列设为float32而不是float64)。
    • 考虑用Dask这样的分布式计算库,它能自动分块处理大数据,减少内存压力。
  3. 检查SATA SSD的健康状态:偶尔,存储设备的IO错误也会导致交换操作失败,你可以用smartctl检查SSD的健康状态:
    sudo smartctl -a /dev/sda  # 替换成你的SATA SSD设备名
    

总结

从你的测试结果(同NVMe分区的交换文件正常)来看,最可能的原因是fstab路径错误导致第二个交换文件未正常挂载,或者优先级设置不明确导致系统提前尝试使用SATA交换文件。先修复这两个点,再结合OOM日志排查,应该能解决问题。当然,优化代码减少内存占用才是长期的最优解。

备注:内容来源于stack exchange,提问作者hamagust

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:44:40