服务器监控入门:CPU 内存告警怎么做

服务器监控入门:CPU 内存告警怎么做

今年有天早上,我习惯性地打开博客看一眼——转圈,打不开。SSH 上去 top 一看,内存被吃光了,系统在疯狂 swap。重启,恢复,前后十分钟。但那十分钟里我一直在想:它挂了多久?我完全不知道。这感觉就像家里烟雾报警器没装电池,着没着火全靠鼻子。 那天之后,我给这台 2核2G 的小机器装上了"烟雾报警器"。下面是从 free、top 看起,到写一个超限告警脚本的完整入门记录。 先学会看:free、top、df 三件套 监控的第一步不是装软件,是学会看机器的脸色。这三个命令够用很久: free -h 看内存。重点看 available 那一列,那是真正还能用的。我的经验:长期低于 200M 就要警惕了,2核2G 的机器,available 掉到 100M 以内,离出事不远。 top 看 CPU 和进程。按 M 按内存排序,按 P 按 CPU 排序,一眼找出吃资源的大户。那天早上吃光我内存的,就是一个失控的进程,top 里排第一,RES 列数字大得刺眼。top 是动态的,按 q 退出,别在里面迷路。 df -h 看硬盘。日志、备份最容易把硬盘吃满,/ 分区用到 85% 以上就该清理了。硬盘满了比内存满了更麻烦——内存满了重启能好,硬盘满了连日志都写不进去。 硬盘满了比内存满了更麻烦,日志和备份最容易把硬盘吃满,我的备份方案是每天凌晨打包、只留 7 天,脚本记在另一篇。 这三个命令,我现在每周看一次,跟检查汽车胎压一个频率。不用天天看,但要养成习惯。 告警脚本:让机器学会"喊疼" 人不可能天天盯着 top,所以第二步是写个脚本:资源超限就喊一嗓子。脚本放在 /root/monitor.sh: #!/bin/bash # 内存使用超过 85% 就告警 MEM_USED=$(free | awk '/Mem:/ {printf "%.0f", $3/$2*100}') # 根分区使用超过 85% 就告警 DISK_USED=$(df / | awk 'NR==2 {print $5}' | tr -d '%') # 1 分钟平均负载超过 CPU 核数就告警(2核机器,超过 2 就算高) LOAD=$(awk '{print $1}' /proc/loadavg) ALERT="" if [ "$MEM_USED" -gt 85 ]; then ALERT="${ALERT}内存使用 ${MEM_USED}%,超过 85%。\n" fi if [ "$DISK_USED" -gt 85 ]; then ALERT="${ALERT}硬盘使用 ${DISK_USED}%,超过 85%。\n" fi if awk "BEGIN {exit !($LOAD > 2)}"; then ALERT="${ALERT}1 分钟负载 ${LOAD},超过 2(2核机器)。\n" fi if [ -n "$ALERT" ]; then echo -e "VPS 告警:\n$ALERT" | mail -s "VPS 资源告警" myemail@example.com fi 解释一下阈值。内存和硬盘设 85%,是留 15% 的缓冲——告警是让你提前处理,不是等火烧眉毛。负载阈值设成 CPU 核数(我这台 2核,就是 2),这是 Unix 世界的老规矩:负载长期超过核数,说明 CPU 真忙不过来了。短期冲高不用慌,看的是持续。 ...

November 1, 2026 · 2 min · 293 words
VPS 备份方案:定时打包网站和数据库

VPS 备份方案:定时打包网站和数据库

有天凌晨三点,我做了个梦:梦见自己手一抖,把网站目录删了。惊醒之后第一个念头不是"还好是梦",而是:如果这是真的,我拿什么恢复?答案是:什么都没有。那天早上送完孩子,我哪儿也没去,直接坐进书房,把备份方案搭了起来。 家里有保险柜放重要文件,服务器也得有个"保险柜"。下面这套方案跑在我这台 2核2G 的机器上,简单、便宜、够用。 先想清楚:备份什么 服务器要备份,家里的证件文件更得备份——我差点因为证件误过事,那篇的教训比这篇还疼。 我的博客是 Hugo 静态站,没有数据库,要备份的东西很清楚: 网站源文件:/var/www/blog 整个目录,包括 markdown 原稿、hugo.toml、主题。原稿丢了,博客就只剩个空壳。 Nginx 配置:/etc/nginx,特别是我手写的那些 server 块。重装系统后照着恢复,十分钟就能复活。 数据库:我这站没有,但脚本里留了 mysqldump 的位置。哪天加了个带数据库的服务,直接把那两行注释打开就行,不用重写脚本。 备份目标就一个原则:能让我从零恢复整站的东西,才值得备份。零零碎碎的日志、缓存,不在名单上。 备份脚本:tar 打包,按日期命名 脚本放在 /root/backup.sh,内容不复杂: #!/bin/bash BACKUP_DIR="/root/backups" DATE=$(date +%Y%m%d) mkdir -p "$BACKUP_DIR" # 打包网站源文件 tar -czf "$BACKUP_DIR/blog-$DATE.tar.gz" -C /var/www blog # 打包 Nginx 配置 tar -czf "$BACKUP_DIR/nginx-$DATE.tar.gz" -C /etc nginx # 如果有数据库,把下面两行打开 # mysqldump -u root -p'你的密码' --all-databases | gzip > "$BACKUP_DIR/mysql-$DATE.sql.gz" # 只保留最近 7 天的备份,旧的自动删 find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete echo "backup done: $DATE" 几个说明:tar -czf 打包加压缩,一行搞定;文件名带日期,blog-20261024.tar.gz 这种,一眼知道是哪天的;最后两行 find ... -delete 是自动清理,只留 7 天。40G 的硬盘经不起无节制堆备份,7 天对个人博客足够了——真出问题,你不会等到第八天才发现。 ...

October 23, 2026 · 2 min · 279 words