# -*- coding: utf-8 -*- r'''第一步:给服务器加 1G swap,并调好内存参数。 == 为什么必须先做这个 == 机器只有 **1936MB 内存,而且一个 swap 都没有**。现在用了 566MB, 看着还有富余 —— 但 Halo 是 **Java 应用**,JVM 默认会按物理内存的 1/4 去要堆(1936/4 ≈ 470MB),加上元空间、线程栈、直接内存, 很容易冲到 700MB+。 **没有 swap 的时候,内存一紧张就是 OOM Killer 直接杀进程** —— 表现是"博客隔一阵就自己挂了",而且 systemd 里只留一句 `Killed process (java)`,很难查。 有 1G swap 就多了一层缓冲:平时不用它(性能不受影响), 突发时才借用,扛过去就没事了。 == 参数怎么选 == * **大小 1G**(用户指定) * **swappiness=10** —— 默认是 60,意思是"内存用到 60% 就开始往 swap 里挪"。对服务器来说这太激进了,会把常用的页换出去导致变卡。 10 表示"只有真要撑不住时才用 swap",正合适。 * **vfs_cache_pressure=50** —— 默认 100,让内核更愿意保留 dentry/inode 缓存(文件操作多的时候有用)。 * **写进 /etc/fstab** —— 不然重启就没了。 == 一个坑 == `swapon` 之后再 `free -m` 才看得到。而且**如果 fstab 写错, 系统可能起不来**(fstab 里有不存在的设备会进 emergency mode)。 所以写完要用 `mount -a` 试一遍,能过才算数。 ''' from __future__ import annotations import sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent sys.path.insert(0, str(ROOT / "_build")) from lssh import run # noqa: E402 REMOTE = r''' set -e echo "==== 加之前 ====" free -m | sed 's/^/ /' echo if swapon --show 2>/dev/null | grep -q .; then echo " 已经有 swap 了,跳过创建:" swapon --show | sed 's/^/ /' else echo "==== 创建 1G swap 文件 ====" # fallocate 比 dd 快得多,而且是稀疏分配 —— 但**有些文件系统 # (比如 btrfs / 某些 overlay)上 fallocate 出来的文件不能当 swap**, # 所以先试 fallocate,失败就退回 dd。 if ! sudo fallocate -l 1G /swapfile 2>/dev/null; then echo " fallocate 不行,改用 dd(慢一点但通用)" sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 status=none fi sudo chmod 600 /swapfile sudo mkswap /swapfile >/dev/null sudo swapon /swapfile echo " ✓ 已启用" fi echo echo "==== 写进 /etc/fstab(重启后自动挂)====" if grep -qE '^\s*/swapfile\s' /etc/fstab; then echo " fstab 里已经有了" else echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab >/dev/null echo " ✓ 已写入" fi echo echo "==== 调内核参数 ====" sudo tee /etc/sysctl.d/99-ykxmz-swap.conf >/dev/null <<'EOF' # swap 调优(配合 halo 博客) # # swappiness 默认 60 太激进 —— 内存用到 60% 就往 swap 挪, # 会把常用页换出去导致变卡。10 = 只有真要撑不住时才用。 vm.swappiness = 10 # 默认 100,改成 50 让内核更愿意保留文件缓存 vm.vfs_cache_pressure = 50 EOF sudo sysctl -p /etc/sysctl.d/99-ykxmz-swap.conf | sed 's/^/ /' echo echo "==== 校验 fstab(写错会导致开不了机!)====" if sudo mount -a 2>&1 | grep -q .; then echo " ⚠ fstab 有问题:" sudo mount -a 2>&1 | sed 's/^/ /' else echo " ✓ fstab 没问题(mount -a 无报错)" fi echo echo "==== 加之后 ====" free -m | sed 's/^/ /' echo echo " --- swap 详情 ---" swapon --show | sed 's/^/ /' echo " --- 当前参数 ---" printf ' swappiness = %s\n' "$(cat /proc/sys/vm/swappiness)" printf ' vfs_cache_pressure = %s\n' "$(cat /proc/sys/vm/vfs_cache_pressure)" ''' def main() -> int: print("=" * 62) print(" 第一步:加 1G swap") print("=" * 62) print() out = run(REMOTE, timeout=400, quiet=True) print(out[1] if isinstance(out, tuple) else out) return 0 if __name__ == "__main__": sys.exit(main())