Linux查看CPU内存负载,top命令详解
前言
服务器变慢、网站卡顿,第一反应是看 CPU 和内存谁吃满了。top 是 Linux 自带的实时监控命令,能动态看到系统负载和每个进程的占用。本篇讲清楚 top 界面每一行含义、常用按键,以及怎么判断到底是 CPU 满还是内存满。
一、启动top
top
进入动态刷新界面,默认每3秒刷新一次,按 q 退出。
二、顶部系统信息各行含义
- 第一行:
load average三个数分别是1分钟、5分钟、15分钟平均负载,数值超过CPU核数说明忙不过来; - 第二行 Tasks:进程总数、运行中、睡眠、停止、僵尸进程数;
- 第三行 CPU:
%us用户进程占用、%sy系统内核占用、%id空闲,id接近0说明CPU紧张; - 第四行 Mem:物理内存总量、已用、空闲、缓存;
- 第五行 Swap:交换分区使用,频繁交换说明内存不足。
看核数判断负载:
nproc
# 假设2核,load average长期超过2就要警惕
三、进程列表关键列
PID进程号;%CPUCPU占用百分比;%MEM内存占用百分比;RES进程实际占用物理内存(KB);COMMAND启动命令。
四、常用交互按键
| 按键 | 作用 |
|---|---|
| P | 按CPU占用降序 |
| M | 按内存占用降序 |
| 1 | 展开每个核心单独显示 |
| k | 输入PID杀掉进程 |
| q | 退出 |
# 静态一次性输出top结果(适合脚本/采集)
top -bn1 | head -20
# 只看某个进程
top -p PID
五、判断思路
- CPU高:按P排序,找%CPU高的进程,常见是死循环PHP、爬虫、计算任务;
- 内存高:按M排序看%MEM和RES,常见内存泄漏、缓存过大;
- 负载高但CPU不高:可能是大量I/O等待或僵尸进程,配合
iostat、vmstat看; - Swap被大量使用:物理内存不够,系统把内存换到磁盘,会明显变慢。
常见坑
- 把load average绝对值当指标:要结合核数,1核负载3和8核负载3完全不同;
- 只看%CPU不看持续时间:瞬时冲高正常,持续90%以上才是问题;
- RES和SHR混淆:RES是独占物理内存,判断内存占用看RES;
- 僵尸进程多:
Z状态,父进程没回收,需要找父进程处理。
总结
top 里按P看CPU、按M看内存,先看顶部load和核数是否匹配,再定位具体进程。CPU满找%CPU高的,内存满找%MEM高的,再决定优化或kill。
遇到问题加QQ23979811 协助处理
Linux磁盘占用100%怎么排查,大文件查找清理方法
前言
服务器磁盘爆满到100%,会导致网站写不了日志、数据库报错、服务异常退出。很多人只看到根目录满,却找不到到底是谁占的。本篇按"先看分区→再找大目录→再找大文件→安全清理"的顺序给出可直接执行的命令。
一、先看哪个分区满了
df -h
看 Use% 列,找到达到100%的挂载点(常见是 / 根分区或 /data)。注意区分分区,别在没满的分区里瞎找。
二、逐级定位占用最大的目录
# 从根目录开始,显示一级目录大小,排序,排除挂载点干扰
du -h --max-depth=1 / 2>/dev/null | sort -rh | head
进入最大的那个目录重复执行,比如:
du -h --max-depth=1 /var 2>/dev/null | sort -rh | head
一层层往下钻,直到定位到具体目录。
三、查找超过指定大小的大文件
# 找出/var下大于500MB的文件
find /var -type f -size +500M -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}'
# 全盘找大于1G的文件
find / -type f -size +1G 2>/dev/null | xargs ls -lh
常见大头:日志文件、MySQL binlog、Docker镜像/容器、上传目录、core dump、旧备份。
四、安全清理方式
- 日志文件:确认无用后清空(不要直接删正在写的文件,空间不释放):
# 清空而不是删除,释放空间且进程句柄仍在 > /var/log/nginx/access.log - 已删除但仍被进程占用的文件(df满但du对不上):
lsof | grep deleted # 找到对应PID后重启该服务释放句柄 - Docker清理:
docker system df # 先看占用 docker system prune -a # 清理无用镜像、停止容器、悬空卷 - 旧备份/binlog:确认可删后
rm -f,MySQL binlog 用PURGE BINARY LOGS正规清理。
五、常见坑
- 直接rm正在写入的大日志:空间不立刻释放,要
> 文件清空或重启进程; - df满du小:典型是已删除文件被进程占用,用
lsof | grep deleted找; - 只删根目录表面:
--max-depth=1逐级下钻才找得到真凶; - 误删数据库文件/系统日志:清理前先
ls -lh确认,重要数据先备份; - Docker不清理:镜像层和停止容器很容易吃掉几十G,
docker system prune定期跑。
总结
df -h 找满的分区,du --max-depth=1 逐级定位,find -size 找大文件,日志用清空、Docker用prune、被占用文件重启释放。按这条链路,100%磁盘很快能查清楚。
遇到问题加QQ23979811 协助处理
Linux crontab定时任务不执行常见原因与排查
前言
crontab 写好了却到点不执行,是服务器运维最常见的坑之一。手动跑脚本正常,定时任务却没反应,问题往往不在脚本本身,而在服务状态、环境变量、时间格式和权限。本篇按从易到难的顺序列出排查点。
一、先确认crond服务在运行
systemctl status crond
# 没启动就启动并设开机自启
systemctl start crond
systemctl enable crond
服务没跑,所有定时任务都不会触发,这是第一个要查的。
二、检查定时任务格式是否正确
标准格式:分 时 日 月 周 命令
# 查看当前用户的定时任务
crontab -l
# 例如:每10分钟执行一次脚本
*/10 * * * * /usr/bin/php /www/backup.php
常见格式错误:分钟位置写成了小时、用了 * 却想表示"第1个"、命令路径用了相对路径。
三、查看cron日志,判断有没有触发
# CentOS7 日志位置
tail -f /var/log/cron
到点看日志里有没有出现这条任务:
- 日志里根本没有:格式没被识别、服务没跑、或时间写错;
- 日志有执行记录但没效果:是脚本/环境问题,往下查。
四、脚本环境变量问题(高频)
cron 的环境比手动登录干净得多,很多命令找不到、相对路径失败。解决:
- 用绝对路径:脚本里和任务里都写全,比如
/usr/bin/php、/www/backup.php; - 开头加载环境:
*/10 * * * * source /etc/profile; /usr/bin/php /www/backup.php - 先手动用cron环境复现:
env -i /bin/bash script.sh模拟干净环境跑一遍。
五、权限与重定向
- 脚本要有执行权限:
chmod +x /www/backup.sh; - 脚本没加 shebang(
#!/bin/bash)会找不到解释器; - 把错误输出留下来方便定位:
*/10 * * * * /usr/bin/php /www/backup.php >> /www/log/cron.log 2>&1加了
2>&1,报错就写进日志,不再"静默失败"。
六、其他易漏点
- 时区不一致:
timedatectl看系统时区,容器里时间错会导致任务错位; - 日和周同时指定是"或"关系,容易误触发,注意语义;
- root和普通用户任务混淆:
sudo crontab -l看root的,普通用户看自己的; - 磁盘满了:日志写不进去,任务看似没执行。
总结
排查顺序:crond服务是否运行 → 任务格式对不对 → /var/log/cron 有没有触发 → 绝对路径和环境变量 → 执行权限与错误重定向 → 时区。手动正常、定时不跑,九成是环境变量和绝对路径问题。
遇到问题加QQ23979811 协助处理
Linux查看服务器开放端口,netstat和ss命令教程
前言
排查网站打不开、端口是否被占用、服务有没有监听,都要先看服务器开放了哪些端口。Linux 上最常用的两个工具是 netstat 和 ss,ss 是新系统推荐的替代,速度更快。本篇讲清楚两个命令的常用组合和怎么判断监听状态。
一、ss命令(推荐,CentOS7自带)
# 查看所有正在监听的TCP端口
ss -tlnp
# 查看所有正在监听的UDP端口
ss -ulnp
# 统计各类连接数量
ss -s
参数含义:-t TCP、-u UDP、-l 只看监听、-n 数字形式显示端口号(不解析域名/服务名)、-p 显示占用进程。
二、netstat命令(老系统常用,需net-tools)
CentOS7 最小化可能没装,先装:
yum install -y net-tools
常用:
# 查看所有监听的TCP端口和进程
netstat -tlnp
# 查看UDP监听
netstat -ulnp
# 查看80端口被谁占用
netstat -tlnp | grep ':80'
# 查看所有已建立连接
netstat -anp | grep ESTABLISHED
三、判断端口是否在监听
以80端口为例:
ss -tlnp | grep ':80'
# 或
netstat -tlnp | grep ':80'
LISTEN表示正在监听,服务正常;- 没有任何输出说明该端口没被程序监听;
- 最后一列能看到进程名和PID,比如
nginx: worker。
四、常用排查组合
# 查某个具体端口(443)
ss -tlnp | grep 443
# 查某进程监听了哪些端口
ss -tlnp | grep nginx
# 实时看连接数最多的IP
ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head
五、常见坑
- 看不到进程名要加 -p,且需要root:普通用户只能看到端口,看不到占用程序,用 sudo 或 root 执行;
- 只看监听不够:服务在本机监听但防火墙/安全组没放行,外网依然连不上,还要配合 firewalld 和云安全组检查;
- netstat 找不到命令:是没装 net-tools,
yum install -y net-tools; - -n 别漏:不加会把80显示成http,grep端口号时容易匹配不到。
总结
记住 ss -tlnp 看 TCP 监听、ss -ulnp 看 UDP、| grep 端口号 精准定位,老机器用 netstat 同参数即可。先确认本机监听,再查防火墙和安全组,排查链路才完整。
遇到问题加QQ23979811 协助处理
Linux查看登录用户
Linux查看登录用户
引言
服务器被多人SSH登录或排查异常连接时,需要看清当前是谁在线、从哪里连进来、在做什么。who、w、id、last几个命令配合,能区分当前身份、在线会话和历史登录记录。
我是谁:whoami
whoami
直接输出当前执行命令的用户名,脚本里判断身份最常用。
查看自己的UID和组
id
输出uid、gid和所属附加组,比whoami信息更全,判断权限时用。
谁在线:who
who
列出所有已登录用户、终端tty、登录时间和来源IP。
在线会话详情:w
w
比who多一列当前正在执行的命令和空闲时长,能看到每个会话在干什么。
历史登录记录:last
last -10
读取/var/log/wtmp,列出最近登录的用户、终端、来源IP和时长,排查入侵看历史。
查特定用户
w root
last root
指定用户名过滤,聚焦某账号的在线和历史。
注意事项
- whoami只看当前身份,who/w看所有在线会话;
- w的JCPU是终端累计时间,PCPU是当前进程时间;
- last依赖wtmp日志,日志轮转后只保留近期;
- 异常来源IP、陌生账号要结合last和/var/log/secure排查;
- 系统服务进程不占登录会话,who看不到;
- 切换用户su后whoami变新用户,但w仍显示原始登录终端。
总结
whoami看当前用户名,id看UID和组,who列在线用户与来源IP,w多显示正在执行的命令,last查历史登录记录。排查时先w看当前在线会话,再last回溯历史,陌生IP和账号结合secure日志,su切换后身份以whoami为准但终端归属原始登录人。
Linux查看目录占用
Linux查看目录占用
引言
磁盘满了先定位是哪个目录吃掉空间,df看整体分区,du逐层下钻找大户。两个命令配合,从分区到目录到文件逐级缩小范围,是磁盘排查的标准路径。
看整体分区:df
df -h
人类可读格式显示各分区总量、已用、可用、使用率,先判断是哪个挂载点满了。
看单个目录总大小
du -sh /var/log
-s汇总,-h人类可读,直接给出这个目录总共占多大。
看一级子目录大小并排序
du -h --max-depth=1 /var | sort -rh | head
只算一层子目录,sort -rh按人类可读大小倒序,head取前几名,快速定位大户。
常用简写
du -sh /var/*
列出/var下每个一级目录大小,逐层进入继续排查。
排除文件系统统计
du -shx /home
-x不跨文件系统,避免把挂载的别的盘也算进来。
看目录下文件数量
ls /var/log | wc -l
有些目录不大但文件海量,inode耗尽也会写不进,配合df -i看inode。
注意事项
- df看分区,du看目录,先df定位再du下钻;
- 大目录du会遍历较慢,加--max-depth限制层数;
- 删除大文件后空间没释放,可能是进程仍持有句柄,需重启进程;
- sort -rh依赖du输出的G/M单位;
- /proc、/sys是虚拟文件系统,du统计无意义;
- 日志目录优先排查,常是增长最快的大户。
总结
df -h看分区整体,du -sh看单目录汇总,--max-depth=1配合sort -rh找一级大户,-x不跨文件系统,ls加wc -l看文件数,df -i查inode。排查路径是先df定位满的分区,再du逐层下钻,删文件后空间不释放要查持有句柄的进程,日志目录优先检查。
Linux查看系统版本
Linux查看系统版本
引言
接手一台服务器,第一件事是搞清楚发行版是CentOS、Ubuntu还是Debian、内核多少位、版本号多少,因为包管理器、软件源、命令差异都跟发行版绑定。下面几组命令覆盖发行版、内核、架构三个维度。
看发行版版本(推荐)
cat /etc/os-release
现代发行版通用,输出NAME、VERSION、PRETTY_NAME,CentOS、Ubuntu、Debian都适用。
看CentOS具体版本
cat /etc/redhat-release
# 或
rpm -q centos-release
RHEL系专用,直接显示CentOS Linux 7/8等版本号。
看Ubuntu/Debian版本
lsb_release -a
# 或
cat /etc/debian_version
lsb_release显示Distributor和Release,没装时读debian_version兜底。
看内核版本
uname -r
# 完整信息
uname -a
-r看内核版本号,-a连架构、主机名、编译时间一起输出。
看CPU架构
arch
# 或
uname -m
x86_64是64位,aarch64是ARM,选安装包时必须对应。
看系统位数和硬件
getconf LONG_BIT
输出32或64,比uname更直接回答多少位。
注意事项
- 发行版和内核是两回事,Ubuntu 22.04可以换内核;
- 包管理器按发行版选:CentOS用yum/dnf,Ubuntu用apt;
- 容器内cat /etc/os-release看到的是镜像版本,不是宿主机;
- 老系统可能没有os-release,用redhat-release或issue兜底;
- 生产升级内核前先uname -r记录当前版本便于回退;
- 脚本里判断发行版读/etc/os-release的ID字段最稳。
总结
cat /etc/os-release看通用发行版,redhat-release看CentOS,lsb_release看Ubuntu,uname -r看内核,arch/uname -m看架构,getconf LONG_BIT看位数。先分清发行版和内核,包管理器按发行版选,容器内读到的是镜像版本,脚本判断优先解析os-release的ID字段,升级内核前记录当前版本方便回退。
Linux查看CPU信息
Linux查看CPU信息
引言
服务器扩容、压测、排查性能瓶颈前,先要知道机器几颗CPU、多少核、主频和架构。/proc/cpuinfo是内核暴露的原生信息,配合lscpu、nproc能快速拿到规格,top/mpstat再看实时占用。
lscpu看汇总
lscpu
一次列出架构、颗数、每颗核数、线程数、主频、缓存,最简洁。
nproc看逻辑核数
nproc
直接输出可用逻辑CPU数,脚本里取核数最方便。
读/proc/cpuinfo
cat /proc/cpuinfo
每颗逻辑核一段,看model name型号、cpu MHz频率、flags指令集。
统计物理颗数和核数
# 物理CPU颗数
grep "physical id" /proc/cpuinfo | sort -u | wc -l
# 每颗物理核数
grep "cpu cores" /proc/cpuinfo | uniq
# 逻辑核总数
grep -c processor /proc/cpuinfo
物理颗数×每颗核数×超线程=逻辑核数。
实时CPU占用
top
mpstat 1
top看整体和进程,mpstat每秒采样看用户态、系统态、idle占比。
注意事项
- 云主机看到的是分配的vCPU,不一定是物理独占;
- 超线程逻辑核不等于物理性能翻倍;
- flags里看是否支持虚拟化、AVX等指令集;
- 排查高占用先top按P按CPU排序找进程;
- 结合uptime看负载和核数是否匹配;
- lscpu在大部分发行版预装,无此命令再读/proc。
总结
规格用lscpu看汇总、nproc取核数、/proc/cpuinfo读型号和指令集,配合grep统计物理颗数与核数,实时占用用top和mpstat。压测和扩容前先分清物理核、逻辑核和超线程,避免按vCPU误判真实算力。
Linux查看端口占用
Linux查看端口占用
引言
启动服务时报Address already in use,说明目标端口被别的进程占着。上线前要确认端口是否监听、被哪个PID占用,常用ss、netstat、lsof三个工具,先定位进程再决定停掉还是换端口。
ss查看(推荐)
ss替代netstat,更快更全:
ss -tlnp | grep 80
- -t TCP,-l 监听状态,-n 数字端口不解析,-p 显示进程PID和名称。
看TCP监听端口最直接。
netstat兼容命令
老系统没有ss时:
netstat -tlnp | grep 80
参数含义和ss一致,输出本地地址:端口、PID/程序名。
lsof按端口查进程
lsof -i:80
直接列出占用80端口的进程命令、PID、用户,适合只盯单个端口。
找到并处理
确认是无用进程后:
kill -9 PID
若是被系统服务占用,优先systemctl stop对应服务,别盲目kill。
查看所有监听端口
ss -tlnp
不加grep,列出全部TCP监听,盘点机器开了哪些服务。
注意事项
- 查端口要root或sudo,普通用户看不到别的进程PID;
- 状态LISTEN才是监听,ESTABLISHED是已建立连接,别混淆;
- 端口被占先判断是不是正常服务,误杀线上进程影响业务;
- 云服务器端口不通还要查安全组和防火墙,不只是本机占用;
- ss在新发行版预装,netstat需装net-tools。
总结
日常用ss -tlnp grep端口最省事,netstat兼容老系统,lsof -i:端口看单个占用。定位PID后先确认进程归属再kill,端口连不上时本机占用、防火墙、云安全组三层都要排查。
Linux查找大文件
Linux查找大文件
引言
服务器磁盘爆满时,df先看哪个分区满,再用du一层层往下钻,找到吃掉空间的大目录和大文件。很多人只会df -h,却定位不到具体是哪个文件,这里讲完整排查链路。
第一步看分区占用
df -h
看Use%和挂载点,确认是/、/data还是/var满,别在没满的分区里瞎找。
第二步定位大目录
du -sh /* 2>/dev/null | sort -rh | head
du -sh统计每个一级目录大小,sort -rh按大小倒序,head取前几名,快速锁定大头目录,再逐层深入:
du -sh /var/* 2>/dev/null | sort -rh | head
第三步找超过100M的单文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
-size +100M表示大于100MB,2>/dev/null丢弃无权限报错,直接列出大文件路径和大小。
常见膨胀位置
- /var/log:日志没轮转,单个日志几个G;
- /tmp:临时文件没清理;
- Docker:/var/lib/docker镜像和容器层堆积;
- 网站上传目录、数据库binlog。
处理建议
- 日志优先清空而不是删文件(> log.log),避免占用文件句柄不释放;
- Docker用docker system prune清理悬空镜像;
- 删之前确认文件没被进程占用,lsof | grep 文件名;
- 不要直接rm正在写入的日志,用truncate -s 0截断。
注意事项
- du统计含磁盘占用,find看文件真实大小,两者结合;
- 根目录全盘find慢,先缩小到df定位的分区;
- 系统目录(/usr、/lib)别乱删,只清理业务数据和日志。
总结
df -h定位满的分区,du -sh逐层排序找大目录,find -size找大文件,先看日志和Docker,清空用truncate别rm占用文件。按分区→目录→文件三层下钻,几分钟就能找到磁盘元凶。
Linux防火墙配置
Linux防火墙配置
引言
云服务器安全不能只靠系统防火墙,开通端口是上线必经步骤。CentOS 7以上默认使用firewalld,很多新手忘了放行端口,导致网站、SSH、数据库从外部连不上。
firewalld常用命令
#查看防火墙状态
firewall-cmd --state
#查看已放行端口
firewall-cmd --list-ports
#永久放行80、443端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
#重新加载生效
firewall-cmd --reload
#移除某个端口
firewall-cmd --permanent --remove-port=3306/tcp
区域概念
firewalld分public、internal等zone,默认public。--permanent写入永久规则,不加只对当前会话生效,重启失效。改完必须reload。
常用放行场景
- Web服务:80、443;
- SSH远程:22(建议改非默认端口再放行);
- 不要对公网开放3306、6379、27017等数据库端口;
- 只允许指定IP访问管理端口更安全:
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=1.2.3.4 port port=22 protocol=tcp accept'
注意事项
- 云服务器除了系统防火墙,还要在云厂商控制台安全组同步放行;
- 改SSH端口前先确认新端口放行,避免把自己挡在门外;
- 防火墙规则最小化,只开放必要端口。
总结
firewalld核心:查看列表、永久加端口、reload生效。记住系统防火墙和云安全组两层都要放行,数据库端口绝不暴露公网,管理端口限制来源IP。
Linux查看系统负载
Linux查看系统负载
引言
服务器CPU、内存压力过大,会造成网站接口响应缓慢、502报错。运维排查服务器性能问题第一步就是查看系统负载,了解服务器当前资源压力,及时扩容或者优化程序。
负载概念
uptime输出的三个数字:1分钟、5分钟、15分钟平均负载。代表等待CPU处理的任务数量。
多核CPU参考标准:4核服务器,负载接近4说明CPU打满;超过代表任务排队,系统过载。
常用命令
# 快速查看负载
uptime
# 实时监控
top
# 更轻量化监控
htop
# 查看CPU核心数量
nproc
top命令内可以按1查看每个核心负载;P按CPU使用率排序,快速找到耗资源进程。
排查思路
- 负载高,CPU使用率高:程序代码循环、大量计算,定位进程优化代码;
- 负载高,CPU使用率低:大量IO等待(磁盘读写慢、数据库阻塞),查看磁盘io
iostat。
实操示例
# 安装iostat
yum install -y sysstat
# 持续查看io状态
iostat -x 1
总结
平均负载不只代表CPU,还包含IO等待。看到高负载不能直接判定CPU瓶颈,结合top、iostat综合定位,区分是计算密集还是IO密集导致服务器卡顿。
Linux 编写systemd服务文件核心用法解析(2026最新整理)
做Linux开发这几年,编写systemd服务文件是被身边同事问得最多的问题之一。今天把答案整理出来,供大家参考。
Linux 磁盘空间清理完整指南(新手必看)
在日常Linux开发中,磁盘空间清理是一个出现频率非常高的话题。无论是新手还是有一定经验的开发者,都可能在细节上踩坑。本文将系统地梳理磁盘空间清理的相关知识,并给出可以直接运行的示例代码。