Compare commits
2 Commits
97ea3e4df0
...
89f79774ff
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
89f79774ff | ||
|
|
87ace8cbe8 |
@@ -206,6 +206,11 @@ export default sidebar({
|
||||
text: "常用记录",
|
||||
icon: "mdi:star",
|
||||
link: "/work/常用.md",
|
||||
},
|
||||
{
|
||||
text: "待办事项",
|
||||
icon: "mdi:checklist",
|
||||
link: "/work/待办事项.md",
|
||||
}
|
||||
],
|
||||
"/apps/": [
|
||||
|
||||
@@ -21,3 +21,102 @@
|
||||
.vp-navbar .auto-link .vp-icon {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.todo-page {
|
||||
--todo-border: rgba(220, 20, 60, 0.2);
|
||||
--todo-accent: rgba(220, 20, 60, 0.08);
|
||||
--todo-card-bg: rgba(255, 255, 255, 0.85);
|
||||
|
||||
.theme-hope-content {
|
||||
h1 {
|
||||
margin-bottom: 0.8rem;
|
||||
font-size: clamp(1.9rem, 2.6vw, 2.3rem);
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0.9rem 0 1.2rem;
|
||||
padding: 0.85rem 1rem;
|
||||
border-radius: 0.8rem;
|
||||
border: 1px solid var(--todo-border);
|
||||
background: linear-gradient(135deg, var(--todo-accent), rgba(220, 20, 60, 0.03));
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1.6rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 1.5rem 0 0.8rem;
|
||||
padding-left: 0.65rem;
|
||||
border-left: 4px solid #dc143c;
|
||||
font-size: clamp(1.2rem, 2.1vw, 1.45rem);
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin: 0.85rem 0 0;
|
||||
padding: 0.85rem 1rem;
|
||||
border: 1px solid var(--todo-border);
|
||||
border-bottom: 0;
|
||||
border-radius: 0.85rem 0.85rem 0 0;
|
||||
background: var(--todo-card-bg);
|
||||
line-height: 1.4;
|
||||
|
||||
.header-anchor {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
h3 + ul {
|
||||
margin: 0 0 0.95rem;
|
||||
padding: 0.8rem 1rem 0.95rem 1.25rem;
|
||||
border: 1px solid var(--todo-border);
|
||||
border-top: 0;
|
||||
border-radius: 0 0 0.85rem 0.85rem;
|
||||
background: var(--todo-card-bg);
|
||||
box-shadow: 0 8px 18px -18px rgba(220, 20, 60, 0.55);
|
||||
|
||||
li {
|
||||
margin: 0.2rem 0;
|
||||
}
|
||||
}
|
||||
|
||||
details {
|
||||
margin-top: 0.6rem;
|
||||
border: 1px dashed var(--todo-border);
|
||||
border-radius: 0.8rem;
|
||||
padding: 0.5rem 0.75rem;
|
||||
background: rgba(220, 20, 60, 0.03);
|
||||
|
||||
summary {
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.todo-page .theme-hope-content {
|
||||
h2 {
|
||||
margin-top: 1.2rem;
|
||||
padding-left: 0.5rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
padding: 0.75rem 0.8rem;
|
||||
font-size: 1.02rem;
|
||||
}
|
||||
|
||||
h3 + ul {
|
||||
padding: 0.7rem 0.8rem 0.8rem 1.1rem;
|
||||
margin-bottom: 0.8rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
104
src/programming/linux/Linux_Mint/scripts/expand_swap.sh
Executable file
104
src/programming/linux/Linux_Mint/scripts/expand_swap.sh
Executable file
@@ -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 ""
|
||||
166
src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh
Executable file
166
src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh
Executable file
@@ -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 ""
|
||||
145
src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh
Executable file
145
src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh
Executable file
@@ -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 ""
|
||||
222
src/programming/linux/Linux_Mint/内存优化完全指南.md
Executable file
222
src/programming/linux/Linux_Mint/内存优化完全指南.md
Executable file
@@ -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 保护,最终把系统稳定性和响应速度拉回到优秀状态。
|
||||
|
||||
<!-- more -->
|
||||
|
||||
## 一 问题背景
|
||||
|
||||
### 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 <PID1> <PID2>
|
||||
```
|
||||
|
||||
清理后,可用内存和 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 开发机、工具常驻多、会话长时间运行,这一套流程可以直接复用。
|
||||
109
src/work/待办事项.md
Normal file
109
src/work/待办事项.md
Normal file
@@ -0,0 +1,109 @@
|
||||
---
|
||||
icon: mdi:checklist
|
||||
date: 2026-03-20
|
||||
pageClass: todo-page
|
||||
category:
|
||||
- 待办
|
||||
tag:
|
||||
- 任务清单
|
||||
title: 待办事项
|
||||
---
|
||||
|
||||
待办事项记录
|
||||
<!-- more -->
|
||||
|
||||
# 待办清单
|
||||
|
||||
> 最后更新: 2026-03-20
|
||||
> 统计: 已完成 5 项、已提交 1 项、待测试 1 项、部分完成 1 项、待确认 1 项、未开始 4 项
|
||||
|
||||
## 清单总览
|
||||
|
||||
- 当前优先: 8(待测试)、13(待确认)、12(部分完成)
|
||||
- 本周建议推进: 3(已提交待验证)、6、7、9、10(未开始)
|
||||
- 已归档完成: 1、2、4、5、11
|
||||
|
||||
## 状态说明
|
||||
|
||||
<Badge text="已完成" type="tip" /> <Badge text="已提交" type="tip" /> <Badge text="待测试" type="info" /> <Badge text="待提交" type="warning" /> <Badge text="部分完成" type="note" /> <Badge text="待确认" type="warning" /> <Badge text="未开始" type="danger" />
|
||||
|
||||
---
|
||||
|
||||
## 当前优先
|
||||
|
||||
### 8. [智慧场站-7050] 完成贵州大唐机器人告警复检需求开发 <Badge text="待测试" type="info" />
|
||||
|
||||
- **描述**: 7050项目机器人告警复检需求开发已完成,等待测试
|
||||
- **下一步**: 安排联调与回归,确认告警复检流程和边界场景
|
||||
|
||||
### 13. V2.00的250985版本是否同步至其他系统 <Badge text="待确认" type="warning" />
|
||||
|
||||
- **描述**: 待确认V2.00的250985版本是否需要同步至其他系统
|
||||
- **下一步**: 与产品/版本负责人确认同步范围和目标版本
|
||||
|
||||
### 12. [智能巡视-7950] 超期逻辑和红外温度矩阵功能同步 <Badge text="部分完成" type="note" />
|
||||
|
||||
- **描述**: 红外温度矩阵功能已同步到V2.00版本,超期逻辑待同步
|
||||
- **下一步**: 对齐超期逻辑差异并补齐同步清单
|
||||
|
||||
### 3. 7050历史三维打包问题 <Badge text="已提交" type="tip" />
|
||||
|
||||
- **描述**: 7050项目历史三维打包问题已修复,代码已提交
|
||||
- **下一步**: 验证发布包可用性,并确认是否转入已完成
|
||||
|
||||
---
|
||||
|
||||
## 待启动
|
||||
|
||||
### 6. [智能巡视-7950] 巡视结果上报和确认功能优化 <Badge text="未开始" type="danger" />
|
||||
|
||||
- **描述**:
|
||||
- 巡视结果上报需要加确认状态、确认时间、是否告警
|
||||
- 巡视结果确认需要加告警相关信息
|
||||
- **下一步**: 先明确字段和状态流转,再拆分开发任务
|
||||
|
||||
### 7. [全部版本] WEB端重新开发实现C++开发的桌面端算法标记功能 <Badge text="未开始" type="danger" />
|
||||
|
||||
- **描述**: WEB端重新开发实现算法标记功能
|
||||
- **下一步**: 先产出交互方案和接口清单
|
||||
|
||||
### 9. [智能巡视-7950] V2.00所有版本同步至2024后问题修复 <Badge text="未开始" type="danger" />
|
||||
|
||||
- **描述**:
|
||||
- 最新的2024,未发送算法资源请求
|
||||
- 其余问题待测试
|
||||
- **下一步**: 先复现资源请求问题,再统一修复策略
|
||||
|
||||
### 10. [智慧场站-7050] 联动新需求开发 <Badge text="未开始" type="danger" />
|
||||
|
||||
- **描述**: 现场需求联动新需求方案开发(已评审)
|
||||
- **下一步**: 按评审结论拆分里程碑并确认排期
|
||||
|
||||
---
|
||||
|
||||
## 已完成归档
|
||||
|
||||
<details>
|
||||
<summary>展开查看已完成事项(5项)</summary>
|
||||
|
||||
### 1. 2.00适配的立即执行时间为空是否需要同步其他版本 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 已同步至3个版本完成
|
||||
|
||||
### 2. 静默监视中多个请求类型的问题 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 已完成并同步到3个版本
|
||||
|
||||
### 4. 2.00修复的250941版本同步到7050 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 2.00版本修复的250941问题已同步到7050项目
|
||||
|
||||
### 5. 排查/alarm/silent/query/hisSilentAlarm/list的stationAlarmStatistics为空 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 已完成并和其他版本同步
|
||||
|
||||
### 11. [智能巡视-7950] 打包脚本调整 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 3个版本都已适配打包脚本,复制Common依赖目录
|
||||
|
||||
</details>
|
||||
Reference in New Issue
Block a user