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

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

  •  
  •   slove · 2023-06-03 08:06:51 +08:00 · 2424 次点击
    这是一个创建于 386 天前的主题,其中的信息可能已经有所发展或是发生改变。
    主机是 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  
       2023-06-03 08:13:31 +08:00 via Android
    加内存
    urnoob
        2
    urnoob  
       2023-06-03 08:16:34 +08:00 via Android
    十有八九是 node 那边漏了,加多大都没有 。
    slove
        3
    slove  
    OP
       2023-06-03 08:31:31 +08:00
    @urnoob 应该是的,一直在增加,可有好的解决办法,停用 node 吗
    Kinnice
        4
    Kinnice  
       2023-06-03 08:47:15 +08:00 via Android
    @slove 定时重启 node
    slove
        5
    slove  
    OP
       2023-06-03 08:56:10 +08:00
    @Kinnice 这个方法可行,谢谢

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

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

    每次升级多几块钱而已
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2203 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 02:01 · PVG 10:01 · LAX 19:01 · JFK 22:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.