Linux 精通之路:性能分析与安全加固

Linux 精通之路:性能分析与安全加固

前两篇解决了"会用"和"会管",本篇目标是"会诊、会防":面对一台表现异常的服务器,能按方法论定位瓶颈;面对公网环境,能系统化地收紧安全。

一、性能分析:先有方法论,再谈工具

新手常见错误是上来就乱试命令。正确的顺序是:先确认"哪里慢"(用户视角)→ 再分层定位资源瓶颈 → 最后落到具体进程。

第一步永远是问:慢在哪?

现象 第一嫌疑 首选工具
命令执行卡顿、load 高 CPU 或 IO uptime / vmstat
网页打开慢但 SSH 正常 网络/应用 curl -w 计时
系统越跑越卡直至卡死 内存(swap 抖动) free / vmstat
文件读写巨慢 磁盘 IO iostat

CPU:从 load 值开始

uptime                        # load average:1/5/15 分钟平均负载
vmstat 1                      # 每秒采样

load 的正确解读:数值大致等于"正在运行 + 等待磁盘 IO 的任务数"。经验判断:load 持续超过 CPU 核数的 2~3 倍算异常。vmstat 的 us(用户态)高→找吃 CPU 的进程;wa(IO 等待)高→瓶颈在磁盘不在 CPU;id 高却卡→可能锁等待。

top -H -p <pid>               # 看某进程的线程级 CPU
pidstat -u 1                  # 按进程统计(sysstat 包)

内存:警惕的不只是"用完了"

free -h

重点看 available 而不是 free(Linux 会把空闲内存拿去做缓存,buff/cache 高是好事)。真正的危险信号:

  • available 持续很低,系统开始用 swap;
  • vmstat 1 的 si/so 列持续非零——正在频繁换页,性能会断崖式下跌;
  • 怀疑内存泄漏:ps aux --sort=-rss | head 找占用大户,对比不同时段的值。

磁盘 IO 与网络

iostat -x 1                   # %util 接近 100% 说明盘打满了;await 是请求平均耗时
df -h                         # 磁盘空间(inode 用 df -i 看,小文件撑爆 inode 是经典坑)
sar -n DEV 1                  # 网卡流量历史(sysstat 自带历史数据,可回溯昨天)

一套通用的"慢了怎么办"流程

uptime          # 1. load 高吗?
vmstat 1        # 2. 是 CPU(us) 还是 IO(wa)?
free -h         # 3. 内存/swap 正常吗?
iostat -x 1     # 4. 哪块盘打满?
top             # 5. 落到具体进程

五个命令按顺序走完,90% 的性能问题能定位到"哪个进程吃哪种资源",剩下的交给应用层分析。

二、内核参数:sysctl 调优入门

/etc/sysctl.conf(或 /etc/sysctl.d/*.conf)里的内核参数,改完 sysctl -p 生效。生产环境最常用的一组:

# 允许排队的半连接与全连接队列增大(高并发入口机)
net.core.somaxconn = 4096
# TIME_WAIT 快速回收复用(短连接高频场景)
net.ipv4.tcp_tw_reuse = 1
# 文件句柄上限("too many open files" 的系统层来源)
fs.file-max = 1000000
# 交换倾向:服务器建议调低,尽量用内存而不是 swap
vm.swappiness = 10

调优铁律:不理解含义的参数不要抄。每改一项都要有观测数据支撑(改前改后对比 ss -s、sar 的指标)。单进程的句柄限制在 systemd 单元里用 LimitNOFILE=65535 设置,与系统级 file-max 是两回事。

三、安全加固:生产服务器必做清单

SSH 是第一道门

# /etc/ssh/sshd_config
PermitRootLogin no              # 禁 root 直接登录
PasswordAuthentication no       # 禁密码,只允许密钥
MaxAuthTries 3

配密钥登录:本地 ssh-keygen 生成,ssh-copy-id user@server 推送公钥,确认密钥能登录后再改配置重启 sshd(systemctl restart sshd 前保持当前会话不断开,另开窗口测试——这是保命习惯)。

防火墙:默认拒绝,按需放行

sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable

原则:只暴露真正对外的端口。数据库、缓存等中间件端口绝不对公网开放。

持续性防线

  • 自动更新安全补丁:sudo apt install unattended-upgrades;
  • fail2ban:自动封禁爆破 SSH 的 IP,sudo apt install fail2ban 默认策略即可用;
  • 最小权限:业务进程用专用低权限用户跑(如 systemd 单元里的 User=),绝不 root 跑应用;
  • 审计留痕:last/lastb 查登录与爆破记录,关键机器开启 auditd;
  • 备份验证:有备份不算完,定期演练恢复(没验证过的备份等于没有备份)。

四、系列总结与学习路线

三篇走完,你已经具备独立维护 Linux 服务器的完整能力:

  1. 基础篇:文件系统、命令行、权限、包管理——"会用";
  2. 进阶篇:进程信号、systemd、网络排障、日志任务——"会管";
  3. 精通篇:性能方法论、内核参数、安全加固——"会诊、会防"。

后续进阶方向建议:① shell 脚本自动化;② nginx 反向代理与负载均衡;③ 容器化(Docker 系列已同步发布);④ 监控体系(Prometheus + Grafana)。Linux 的深度在于"理解每一个报错背后的机制",保持好奇心,遇到问题先问"为什么"。

动手练习

  1. 用 vmstat 1 制造一次高 IO 场景(如 dd if=/dev/zero of=/tmp/big bs=1M count=4096),观察 wa 列变化,删掉文件后再观察恢复。
  2. 完成一台测试机的 SSH 加固:密钥登录 + 禁 root + fail2ban,并从另一台机器验证。
  3. 找出你服务器上 TIME_WAIT 最多的目标地址(ss -tn state time-wait | awk '{print $4}' | sort | uniq -c | sort -rn | head),思考是什么业务模式造成的。

评论(0)

0 / 2000
还没有评论,来抢沙发