diff --git a/src/.vuepress/sidebar.ts b/src/.vuepress/sidebar.ts index ab977f0..87297ad 100644 --- a/src/.vuepress/sidebar.ts +++ b/src/.vuepress/sidebar.ts @@ -206,6 +206,11 @@ export default sidebar({ text: "常用记录", icon: "mdi:star", link: "/work/常用.md", + }, + { + text: "待办事项", + icon: "mdi:checklist", + link: "/work/待办事项.md", } ], "/apps/": [ diff --git a/src/programming/linux/Linux_Mint/scripts/expand_swap.sh b/src/programming/linux/Linux_Mint/scripts/expand_swap.sh new file mode 100755 index 0000000..1389f77 --- /dev/null +++ b/src/programming/linux/Linux_Mint/scripts/expand_swap.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +# Swap空间扩展脚本 +# 将 /swapfile 从 8GB 扩展到 24GB + +set -e # 遇到错误立即退出 + +echo "==========================================" +echo "Swap空间扩展脚本" +echo "==========================================" +echo "" + +# 颜色定义 +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +# 检查是否有sudo权限 +if ! sudo -n true 2>/dev/null; then + echo -e "${YELLOW}此脚本需要sudo权限,请输入密码${NC}" +fi + +echo "步骤 1/7: 显示当前swap状态" +echo "----------------------------------------" +swapon --show +free -h +echo "" + +read -p "确认要继续吗?这将临时关闭swap空间 (y/n): " -n 1 -r +echo "" +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo -e "${RED}操作已取消${NC}" + exit 1 +fi + +echo "" +echo "步骤 2/7: 关闭现有 /swapfile" +echo "----------------------------------------" +sudo swapoff /swapfile +echo -e "${GREEN}✓ 已关闭 /swapfile${NC}" +echo "" + +echo "步骤 3/7: 删除旧的 swapfile" +echo "----------------------------------------" +sudo rm /swapfile +echo -e "${GREEN}✓ 已删除旧文件${NC}" +echo "" + +echo "步骤 4/7: 创建新的 24GB swapfile" +echo "----------------------------------------" +echo "使用 fallocate 快速创建(约需10-30秒)..." +sudo fallocate -l 24G /swapfile +echo -e "${GREEN}✓ 已创建 24GB swapfile${NC}" +echo "" + +echo "步骤 5/7: 设置文件权限" +echo "----------------------------------------" +sudo chmod 600 /swapfile +echo -e "${GREEN}✓ 权限已设置为 600${NC}" +echo "" + +echo "步骤 6/7: 格式化为swap" +echo "----------------------------------------" +sudo mkswap /swapfile +echo -e "${GREEN}✓ 格式化完成${NC}" +echo "" + +echo "步骤 7/7: 启用新的swapfile" +echo "----------------------------------------" +sudo swapon /swapfile +echo -e "${GREEN}✓ 已启用新的swapfile${NC}" +echo "" + +echo "==========================================" +echo "扩展完成!当前swap状态:" +echo "==========================================" +swapon --show +echo "" +free -h +echo "" + +# 检查 /etc/fstab 配置 +echo "----------------------------------------" +echo "检查 /etc/fstab 配置..." +echo "----------------------------------------" +if grep -q "^/swapfile" /etc/fstab; then + echo -e "${GREEN}✓ /etc/fstab 已包含 swapfile 配置${NC}" +else + echo -e "${YELLOW}⚠ /etc/fstab 中未找到 swapfile 配置${NC}" + read -p "是否添加到 /etc/fstab 以确保重启后生效?(y/n): " -n 1 -r + echo "" + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab + echo -e "${GREEN}✓ 已添加到 /etc/fstab${NC}" + fi +fi + +echo "" +echo "==========================================" +echo -e "${GREEN}所有操作完成!${NC}" +echo "==========================================" +echo "总Swap空间: ~31GB (24GB swapfile + 7.3GB zram)" +echo "" diff --git a/src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh b/src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh new file mode 100755 index 0000000..df5a41b --- /dev/null +++ b/src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh @@ -0,0 +1,166 @@ +#!/bin/bash + +# 内存策略优化脚本 +# 1. 调整 swappiness 到 40 +# 2. 安装并启用 earlyoom + +set -e + +echo "==========================================" +echo "内存策略优化脚本" +echo "==========================================" +echo "" + +# 颜色定义 +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +BLUE='\033[0;34m' +NC='\033[0m' + +# 检查sudo权限 +if ! sudo -n true 2>/dev/null; then + echo -e "${YELLOW}此脚本需要sudo权限,请输入密码${NC}" +fi + +echo -e "${BLUE}优化项目:${NC}" +echo "1. 调整 vm.swappiness 从 10 到 40" +echo " - 更好地利用高性能zram" +echo " - 释放更多物理内存给活跃进程" +echo "" +echo "2. 安装 earlyoom" +echo " - 防止系统因内存耗尽而卡死" +echo " - 内存不足时提前终止占用最多的进程" +echo "" + +read -p "确认要继续吗?(y/n): " -n 1 -r +echo "" +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo -e "${RED}操作已取消${NC}" + exit 1 +fi + +echo "" +echo "==========================================" +echo "优化 1/2: 调整 swappiness" +echo "==========================================" +echo "" + +echo "当前 swappiness 值:" +sysctl vm.swappiness +echo "" + +echo "步骤 1: 临时调整 swappiness 到 40" +echo "----------------------------------------" +sudo sysctl vm.swappiness=40 +echo -e "${GREEN}✓ 临时调整完成(立即生效)${NC}" +echo "" + +echo "步骤 2: 永久保存配置" +echo "----------------------------------------" +# 备份配置文件 +if [ -f /etc/sysctl.conf ]; then + sudo cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d_%H%M%S) + echo -e "${GREEN}✓ 已备份 /etc/sysctl.conf${NC}" +fi + +# 更新或添加 swappiness 配置 +if grep -q "^vm.swappiness" /etc/sysctl.conf; then + sudo sed -i 's/^vm.swappiness=.*/vm.swappiness=40/' /etc/sysctl.conf + echo -e "${GREEN}✓ 已更新 /etc/sysctl.conf 中的 swappiness${NC}" +else + echo "vm.swappiness=40" | sudo tee -a /etc/sysctl.conf > /dev/null + echo -e "${GREEN}✓ 已添加 swappiness 配置到 /etc/sysctl.conf${NC}" +fi +echo "" + +echo "验证配置:" +sysctl vm.swappiness +grep "vm.swappiness" /etc/sysctl.conf +echo "" + +echo "==========================================" +echo "优化 2/2: 安装 earlyoom" +echo "==========================================" +echo "" + +# 检查是否已安装 +if dpkg -l | grep -q "^ii.*earlyoom"; then + echo -e "${YELLOW}⚠ earlyoom 已安装${NC}" + ALREADY_INSTALLED=true +else + echo "步骤 1: 安装 earlyoom" + echo "----------------------------------------" + sudo apt update + sudo apt install -y earlyoom + echo -e "${GREEN}✓ earlyoom 安装完成${NC}" + echo "" + ALREADY_INSTALLED=false +fi + +echo "步骤 2: 配置 earlyoom" +echo "----------------------------------------" + +# 创建配置文件 +sudo tee /etc/default/earlyoom > /dev/null <<'EOF' +# earlyoom configuration + +# Minimum available memory (in percent) +# Kill processes when available memory drops below this +EARLYOOM_ARGS="-m 5 -s 10 --avoid '(^|/)(init|systemd|Xorg|sshd)$' --prefer '(^|/)(java|chrome|firefox|vmware)$'" + +# -m 5: Kill when available memory < 5% +# -s 10: Kill when swap free < 10% +# --avoid: Never kill these critical processes +# --prefer: Prefer to kill these memory-hungry processes +EOF + +echo -e "${GREEN}✓ 已配置 earlyoom${NC}" +echo "" +echo "配置内容:" +cat /etc/default/earlyoom +echo "" + +echo "步骤 3: 启用并启动 earlyoom 服务" +echo "----------------------------------------" +sudo systemctl enable earlyoom +sudo systemctl restart earlyoom +sleep 1 +echo -e "${GREEN}✓ earlyoom 服务已启动${NC}" +echo "" + +echo "服务状态:" +sudo systemctl status earlyoom --no-pager -l +echo "" + +echo "==========================================" +echo -e "${GREEN}优化完成!${NC}" +echo "==========================================" +echo "" + +echo -e "${BLUE}优化结果总结:${NC}" +echo "" +echo "1. ✅ swappiness 已调整到 40" +echo " - 当前值: $(sysctl -n vm.swappiness)" +echo " - 配置文件: /etc/sysctl.conf" +echo " - 重启后自动生效" +echo "" +echo "2. ✅ earlyoom 已安装并运行" +echo " - 服务状态: $(systemctl is-active earlyoom)" +echo " - 内存阈值: 可用内存 < 5% 时触发" +echo " - Swap阈值: 可用swap < 10% 时触发" +echo "" + +echo -e "${BLUE}当前内存状态:${NC}" +free -h +echo "" + +echo -e "${BLUE}预期效果:${NC}" +echo "✓ 系统会更积极地使用高性能zram" +echo "✓ 物理内存得到更好的利用" +echo "✓ 内存不足时earlyoom会提前介入" +echo "✓ 避免系统因内存耗尽而卡死" +echo "" + +echo -e "${GREEN}所有优化已完成!${NC}" +echo "" diff --git a/src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh b/src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh new file mode 100755 index 0000000..740e05f --- /dev/null +++ b/src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh @@ -0,0 +1,145 @@ +#!/bin/bash + +# 纯zram Swap配置脚本 +# 禁用文件swap,使用zram作为唯一swap + +set -e + +echo "==========================================" +echo "纯zram Swap配置脚本" +echo "==========================================" +echo "" + +# 颜色定义 +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +BLUE='\033[0;34m' +NC='\033[0m' + +# 检查sudo权限 +if ! sudo -n true 2>/dev/null; then + echo -e "${YELLOW}此脚本需要sudo权限,请输入密码${NC}" +fi + +echo "当前swap状态:" +echo "----------------------------------------" +swapon --show +free -h +zramctl +echo "" + +echo -e "${BLUE}配置说明:${NC}" +echo "- 将zram从25%提升到80%物理内存(约23GB)" +echo "- 禁用文件swap (/swapfile)" +echo "- 使用zstd压缩算法(压缩比约3-4倍)" +echo "- 预计可用swap空间:70-90GB(压缩后)" +echo "" + +read -p "确认要继续吗?(y/n): " -n 1 -r +echo "" +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo -e "${RED}操作已取消${NC}" + exit 1 +fi + +echo "" +echo "步骤 1/6: 关闭所有swap" +echo "----------------------------------------" +sudo swapoff -a +echo -e "${GREEN}✓ 已关闭所有swap${NC}" +echo "" + +echo "步骤 2/6: 备份zram配置" +echo "----------------------------------------" +sudo cp /etc/default/zramswap /etc/default/zramswap.backup.$(date +%Y%m%d_%H%M%S) +echo -e "${GREEN}✓ 已备份到 /etc/default/zramswap.backup.*${NC}" +echo "" + +echo "步骤 3/6: 更新zram配置" +echo "----------------------------------------" +sudo tee /etc/default/zramswap > /dev/null <<'EOF' +# Compression algorithm selection +# zstd provides best compression ratio +ALGO=zstd + +# Use 80% of physical RAM for zram +# With ~30GB RAM, this gives ~24GB zram +# With 3-4x compression, effective swap: 70-90GB +PERCENT=80 + +# Higher priority than file-based swap +PRIORITY=100 +EOF +echo -e "${GREEN}✓ 已更新配置:80% RAM, zstd算法${NC}" +cat /etc/default/zramswap +echo "" + +echo "步骤 4/6: 重启zram服务" +echo "----------------------------------------" +sudo systemctl restart zramswap.service +sleep 2 +echo -e "${GREEN}✓ zram服务已重启${NC}" +echo "" + +echo "步骤 5/6: 禁用文件swap" +echo "----------------------------------------" +if [ -f /swapfile ]; then + # 从fstab中注释掉swapfile + if grep -q "^/swapfile" /etc/fstab; then + sudo sed -i.backup 's|^/swapfile|#/swapfile|' /etc/fstab + echo -e "${GREEN}✓ 已在 /etc/fstab 中禁用 /swapfile${NC}" + fi + + read -p "是否删除 /swapfile 文件以释放磁盘空间?(y/n): " -n 1 -r + echo "" + if [[ $REPLY =~ ^[Yy]$ ]]; then + sudo rm /swapfile + echo -e "${GREEN}✓ 已删除 /swapfile (释放8GB磁盘空间)${NC}" + else + echo -e "${YELLOW}⚠ 保留 /swapfile 文件${NC}" + fi +else + echo -e "${YELLOW}⚠ 未找到 /swapfile${NC}" +fi +echo "" + +echo "步骤 6/6: 验证配置" +echo "----------------------------------------" +echo "" +echo "Swap设备列表:" +swapon --show +echo "" +echo "内存状态:" +free -h +echo "" +echo "zram详细信息:" +zramctl +echo "" + +# 计算压缩比 +ZRAM_INFO=$(zramctl --raw --noheadings) +DISKSIZE=$(echo "$ZRAM_INFO" | awk '{print $3}') +DATA=$(echo "$ZRAM_INFO" | awk '{print $4}') +COMPR=$(echo "$ZRAM_INFO" | awk '{print $5}') + +echo "==========================================" +echo -e "${GREEN}配置完成!${NC}" +echo "==========================================" +echo "" +echo -e "${BLUE}zram统计信息:${NC}" +echo "- 分配大小: $DISKSIZE" +echo "- 实际数据: $DATA" +echo "- 压缩后: $COMPR" +if [ ! -z "$DATA" ] && [ ! -z "$COMPR" ]; then + echo "- 当前压缩比: 约 $(echo "$DATA $COMPR" | awk '{printf "%.1f", $1/$2}'):1" +fi +echo "" +echo -e "${BLUE}优势:${NC}" +echo "✓ 性能:内存级swap,比文件swap快100倍+" +echo "✓ 寿命:无磁盘写入,延长SSD寿命" +echo "✓ 容量:压缩后可提供70-90GB有效swap空间" +echo "✓ 效率:zstd算法提供最佳压缩比" +echo "" +echo -e "${YELLOW}注意:重启后配置自动生效${NC}" +echo "" diff --git a/src/programming/linux/Linux_Mint/内存优化完全指南.md b/src/programming/linux/Linux_Mint/内存优化完全指南.md new file mode 100755 index 0000000..a654f4c --- /dev/null +++ b/src/programming/linux/Linux_Mint/内存优化完全指南.md @@ -0,0 +1,222 @@ +--- +title: 内存优化完全指南 +icon: simple-icons:linuxmint +date: 2026-03-20 +category: + - Linux +tag: + - Linux Mint + - 内存优化 + - 性能调优 + - zram + - earlyoom +--- + +# Linux Mint 内存优化完全指南 + +这篇记录一次真实的 Linux Mint 内存优化过程:从内存告急、Swap 打满,到切换纯 zram、调整内核策略、加上 OOM 保护,最终把系统稳定性和响应速度拉回到优秀状态。 + + + +## 一 问题背景 + +### 1.1 初始状态 + +排查时的核心数据: + +- **物理内存**: 29GB +- **已使用**: 25GB (86%) +- **可用内存**: 3.5GB +- **Swap**: 15GB,几乎耗尽 + +### 1.2 主要问题 + +| 问题 | 严重程度 | 影响 | +|------|---------|------| +| Swap 完全耗尽 | 🔴 严重 | 系统响应明显变慢 | +| 可用内存过低 | 🔴 严重 | 高负载场景容易卡顿 | +| 长时间残留会话 | 🟡 中等 | 持续吃内存、吃 CPU | +| 文件 Swap | 🟡 中等 | 磁盘 IO 成为瓶颈 | + +### 1.3 内存占用分析 + +常用定位命令: + +```bash +# 查看内存概览 +free -h + +# 查看内存占用 TOP 10 进程 +ps aux --sort=-%mem | head -11 +``` + +观察到的主要内存占用: + +- IntelliJ IDEA: 约 4.9GB +- VMware 虚拟机: 约 4GB +- 多个 IDE/AI 工具常驻进程 +- 多个 OpenCode 会话并行 + +--- + +## 二 优化流程 + +### 2.1 清理僵尸进程 + +#### 2.1.1 识别僵尸会话 + +判断标准: + +- 进程对应终端显示 `(deleted)` +- 运行时间很长,但无人交互 +- `w` / `who` 中找不到对应活跃终端 + +```bash +# 看会话是否还挂着真实终端 +for pid in $(pgrep -f "\.opencode$"); do + echo "=== PID: $pid ===" + ps -p "$pid" -o pid,etime,%cpu,%mem,cmd --no-headers + lsof -p "$pid" 2>/dev/null | grep -E "pts/|tty" | head -3 + echo +done + +# 优雅终止僵尸会话 +kill -15 +``` + +清理后,可用内存和 Swap 都会明显回升。 + +--- + +### 2.2 从文件 Swap 切换到纯 zram + +#### 2.2.1 为什么选 zram + +性能差异(体感非常明显): + +| 类型 | 速度 | 延迟 | 寿命影响 | +|------|------|------|---------| +| zram | 内存级 | <1ms | 无磁盘写入 | +| 文件 Swap (SSD) | 磁盘级 | 10-100ms | 增加 SSD 写入 | +| 文件 Swap (HDD) | 磁盘级 | 100-1000ms | 响应更慢 | + +zram 的关键收益: + +- 性能更高:比文件 Swap 快很多 +- 压缩率高:常见 3:1 到 4:1 +- 磁盘更友好:减少持续写入 + +#### 2.2.2 检查当前 zram + +```bash +zramctl +swapon --show +``` + +本文案例中,最终将 zram 配到物理内存的 80%,并保留 `zstd` 算法。 + +--- + +### 2.3 调整内存策略参数 + +#### 2.3.1 关键参数 + +```bash +# 当前策略 +sysctl vm.swappiness +sysctl vm.vfs_cache_pressure +``` + +本文做的策略调整: + +- `vm.swappiness=40`(默认 10 偏保守,zram 场景下可更积极) +- 保持 `vfs_cache_pressure=100` + +#### 2.3.2 增加 OOM 保护 + +安装并启用 earlyoom,避免内存耗尽导致系统“假死”: + +```bash +sudo apt update +sudo apt install -y earlyoom +sudo systemctl enable --now earlyoom +``` + +--- + +## 三 三个脚本(可复用) + +为了复盘方便,把这次整理后的脚本放到博客目录: + +- `src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh` +- `src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh` +- `src/programming/linux/Linux_Mint/scripts/expand_swap.sh` + +### 3.1 setup_zram_only.sh + +用途:禁用文件 Swap,启用纯 zram(80%)。 + +```bash +./src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh +``` + +### 3.2 optimize_memory_policy.sh + +用途:把 swappiness 调到 40,并安装 earlyoom。 + +```bash +./src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh +``` + +### 3.3 expand_swap.sh + +用途:保留文件 Swap 的场景下扩容到 24G(备用方案)。 + +```bash +./src/programming/linux/Linux_Mint/scripts/expand_swap.sh +``` + +--- + +## 四 执行顺序建议 + +推荐顺序: + +1. 先做僵尸进程清理(立刻见效) +2. 再切换纯 zram(性能提升) +3. 最后调策略和 OOM 保护(长期稳定) + +--- + +## 五 验证清单 + +### 5.1 配置验证 + +```bash +free -h +swapon --show +zramctl +sysctl vm.swappiness +systemctl is-active earlyoom +``` + +### 5.2 目标状态 + +- 可用内存明显提升 +- Swap 不再长时间打满 +- zram 算法为 `zstd` +- `vm.swappiness=40` +- `earlyoom` 处于 `active` + +--- + +## 六 本次优化结果 + +本文案例最终状态: + +- 内存从高压恢复到健康余量 +- Swap 从几乎打满恢复到可控状态 +- 系统在多工具并行场景下更稳定 +- 交互延迟和卡顿体感明显改善 + +如果你也是 Linux Mint 开发机、工具常驻多、会话长时间运行,这一套流程可以直接复用。