V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
slove
V2EX  ›  服务器

主机 swap 满了,有好的优化方法吗

  •  
  •   slove · 319 天前 · 2334 次点击
    这是一个创建于 319 天前的主题,其中的信息可能已经有所发展或是发生改变。
    主机是 1C1G ,安装了包塔英文版和 docker ,运行一段时间,发现 swap 满了,只能用重启办法,要不然,运行的网站无法访问,发现占用 swap 最多的 10 个程序:
    mysqld 209.465M
    node 152.484M
    ruby2.7 150.934M
    node 123.125M
    ruby2.7 59.0898M
    node 32.7227M
    node 32.6484M
    BT-Panel 31.8359M
    nginx 25.8672M
    nginx 24.4453M
    是不是只能增加 swap 空间,有其他解决办法吗,或者达到一定数值,自动重启占用 swap 的程序,对 linux 一知半解,希望有高手帮忙解答下
    21 条回复    2023-06-03 18:56:28 +08:00
    mingl0280
        1
    mingl0280  
       319 天前 via Android
    加内存
    urnoob
        2
    urnoob  
       319 天前 via Android
    十有八九是 node 那边漏了,加多大都没有 。
    slove
        3
    slove  
    OP
       319 天前
    @urnoob 应该是的,一直在增加,可有好的解决办法,停用 node 吗
    Kinnice
        4
    Kinnice  
       319 天前 via Android
    @slove 定时重启 node
    slove
        5
    slove  
    OP
       319 天前
    @Kinnice 这个方法可行,谢谢

    @mingl0280 谢谢
    @urnoob 谢谢
    makelove
        6
    makelove  
       319 天前
    我的 node 配置
    LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so /usr/bin/node --max_old_space_size=512 -max_semi_space_size=4 main.js
    makelove
        7
    makelove  
       319 天前
    另外我的 node 程序发现内存会慢慢涨上去,可能一个月后就超过新启动时不少,不知道是 node 本身问题还是我用的第三方库问题,我的办法是在程序里定时监控 process.memoryUsage(),如果一直超过 10 次就自杀,利用 systemd 本身的机制立刻自启。
    kaneg
        8
    kaneg  
       319 天前 via iPhone
    1G 的机器跑这么多应用,内存满了很正常。如果不想增加物理内存,又对程序速度不敏感,那就增加 swap ,增加几倍,是成本最低的一种方法。
    slove
        9
    slove  
    OP
       319 天前
    @makelove 我的问题和你差不多,刚刚准备增加 swap 分区,用 swapoff -a 关闭,机器登陆不了,只能重启了,等运行一段时间,再查看是哪个程序占用在增加
    slove
        10
    slove  
    OP
       319 天前
    @kaneg 就像 2 楼说的,如果有个程序占用一直增加,加多大都没用啊,现在接受 4 楼建议,过一段时间,设置个定时重启
    infun
        11
    infun  
       319 天前
    crontab -e # 注意选 VIM
    0 4 * * * /usr/sbin/reboot

    我自己的机器都这样搞
    season8
        12
    season8  
       319 天前
    @slove #3 pm2 update 可以重启所有 node 进程,泄露的进程也会被清理掉
    slove
        13
    slove  
    OP
       319 天前
    @season8 这个好,刚刚还在搜索怎么查询哪个 node 进程占用 swap ,这就来了,非常感谢
    @infun 你这个是重启机器吧,机器每次重启,都需要十几分钟,不太想用重启机器这个方法,还是感谢你的热心回复。
    webshe11
        14
    webshe11  
       319 天前
    再搞个 zram 作为 swap
    northbrunv
        15
    northbrunv  
       318 天前
    最简单的办法,加内存。swap 是用硬盘当内存,性能很差的。
    northbrunv
        16
    northbrunv  
       318 天前
    内存是内存。硬盘是硬盘。swap 只是内存价格昂贵时代遗留下的产物。
    现在内存价格便宜的爆炸,80 块就能买到 8g 的 ddr4 内存。
    同时 vps 厂商的大内存机器价格也很便宜了。
    blankmiss
        17
    blankmiss  
       318 天前
    这种问题还要问什么 不管是 swap 还是 zram 难道你虚拟内存 比直接内存好用吗 直接升配置不比这些操作来的简单,来的性能好,当然如果是因为穷 那当我没说
    systemcall
        18
    systemcall  
       318 天前 via Android
    可以试试用 zram ,策略激进点,你这个场景应该可以节省不少内存。牺牲性能、吃 CPU ,但是比 swap 到磁盘快
    swap 好像也可以先压缩后再放硬盘上,没试过。主机是什么配置? CPU 和硬盘是什么呢?
    很多办法都可以限制单个进程最大的 CPU 使用。还有就是你觉得卡死了,可能只是因为一直在反复地把页面从内存和 swap 之间搬来搬去,你可以试试写个程序来监控和达到一个阈值来重启对应的服务,不要等满了再重启就好
    systemcall
        19
    systemcall  
       318 天前 via Android
    @northbrunv #16
    当你要卖整机,并且出货量上去了,就不会这么想了
    能用 256M D3 跑起来的东西,为什么要用 2G D4 呢?
    northbrunv
        20
    northbrunv  
       318 天前
    @systemcall 一个月多花 5 块钱能解决的东西,为什么要浪费时间调来调去?
    dianso
        21
    dianso  
       318 天前
    我的 2C2G 换了 2C4G 现在 2C8G

    每次升级多几块钱而已
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5696 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 03:23 · PVG 11:23 · LAX 20:23 · JFK 23:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.