Linux查看进程占用内存最高,kill进程方法
前言
服务器内存吃紧、Swap被刷爆,往往是某个程序内存泄漏或卡死进程占着不放。要先找到"谁在吃内存",确认后再决定是优雅重启还是直接kill。本篇给出从查进程到杀进程的完整命令。
一、按内存占用排序找进程
ps 一次性列出并排序,输出RES(实际物理内存,单位KB):
# 按内存占用从高到低,取前10
ps aux --sort=-%mem | head -10
# 按CPU占用排序
ps aux --sort=-%cpu | head -10
列说明:USER 进程用户、%MEM 内存占比、RSS 实际物理内存、COMMAND 启动命令。
更直观的内存排行:
# 显示内存占用最高的进程,VSZ/RSS单位KB
ps -eo pid,ppid,user,%mem,%cpu,rss,comm --sort=-rss | head
二、用top/htop交互查看
top
# 进入后按 M 按内存排序,按 P 按CPU排序,k 输入PID杀进程,q退出
装个 htop 更清楚:
yum install -y htop
htop
三、按名字批量找进程PID
# 查php-fpm相关进程
pgrep -af php-fpm
# 或
ps -ef | grep php-fpm | grep -v grep
pgrep 只输出PID,-a 带命令行。
四、kill进程(先温柔再强杀)
# 正常结束(SIGTERM=15),给进程清理机会
kill PID
# 按名字结束所有同名进程
killall php-fpm
pkill -f "php think"
# 杀不掉再强制杀(SIGKILL=9),数据可能损坏,最后手段
kill -9 PID
信号优先级:
kill -15(默认):请求退出,进程可捕获;kill -9:直接杀死,无法拦截。
服务类进程优先用它自己的重启命令而不是裸kill:
systemctl restart php-fpm
五、常见坑
- 只看%MEM不看RSS:共享内存会被重复算,判断真实占用看RSS;
- 上来就kill -9:数据库、日志服务强杀可能坏数据,先15再9;
- 杀错进程:杀之前用
ps -p PID -o cmd确认这个PID到底是谁; - 僵尸进程杀不掉:状态
Z的僵尸要杀它的父进程,僵尸本身已经不占CPU只占PID表; - kill完又自动起来:被systemd/守护进程托管,要用
systemctl stop或它的管理命令,否则白杀。
总结
ps aux --sort=-%mem | head 或 top 按M排序找内存大户,确认PID后先用 kill(15)优雅结束,不行再 kill -9。服务类进程优先 systemctl restart,避免强杀造成数据损坏。
遇到问题加QQ23979811 协助处理
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查看进程占用内存最高,kill进程方法
前言
服务器内存用满了,不知道哪个进程占的?找到之后怎么杀掉?本文就讲一下怎么查看占用内存最高的进程,以及怎么 kill 掉。
查看内存占用
top 命令(最常用)
top
打开后默认按 CPU 排序,按 M 键(大写)就会按内存排序。
输出里重点看:
PID:进程号USER:运行用户%MEM:内存占用百分比RES:实际用的物理内存(KB)
按 q 退出。
ps 命令
一行命令直接看内存占用前 10:
ps aux --sort=-%mem | head -10
输出按内存从大到小排,前 10 个就是最占内存的。
只看进程名和 PID
ps aux --sort=-%mem | head -10 | awk '{print $2, $11}'
只显示 PID 和进程名,更简洁。
kill 杀掉进程
kill 命令
先从 top 或 ps 里找到进程 PID,然后:
kill 进程号
比如杀掉 PID 为 1234 的进程:
kill 1234
kill -9 强制杀
有时候 kill 没用,进程就是不死,用 -9 强制杀:
kill -9 1234
注意: -9 是强杀,进程没机会清理资源,可能导致数据丢失。尽量先试普通 kill,不行再 -9。
pkill 按名字杀
不用找 PID,直接按进程名杀:
pkill nginx
杀掉所有叫 nginx 的进程。
killall 杀同名进程
killall nginx
和 pkill 类似,也是按名字杀。
常用操作示例
找出最占内存的进程并杀掉
# 找前5个最占内存的
ps aux --sort=-%mem | head -5
# 假设 PID 是 1234,杀掉
kill 1234
杀掉所有 php-fpm 进程
pkill php-fpm
杀掉某个用户的所有进程
pkill -u www
常见坑
坑1:杀错进程了
把系统关键进程杀了,服务器直接挂。
解决: 杀之前先确认一下这个进程是干嘛的:
ps -p 进程号 -o comm=
或者:
ls -l /proc/进程号/exe
坑2:kill 了进程又自动起来了
杀掉之后过几秒又自动启动了。
原因: 有服务管理工具(systemd、supervisor)在监控,挂了就自动拉起。
解决: 先停服务再杀:
systemctl stop nginx
或者:
supervisorctl stop nginx
坑3:kill 没权限
普通用户杀不了 root 启动的进程。
解决: 加 sudo 或切 root:
sudo kill 1234
总结
| 命令 | 作用 |
|---|---|
top |
实时看进程,按 M 按内存排序 |
ps aux --sort=-%mem |
按内存排序看进程 |
kill 进程号 |
正常杀进程 |
kill -9 进程号 |
强制杀进程 |
pkill 进程名 |
按名字杀进程 |
killall 进程名 |
杀同名所有进程 |
服务器内存爆了就用 top 按 M 排序,找到最占内存的杀掉就行。
遇到问题加QQ23979811 协助处理
Linux查看CPU、内存负载,top命令详解
前言
服务器变慢了?网站卡了?第一反应就是看看 CPU 和内存是不是跑满了。Linux 下最常用的查看系统负载的命令就是 top,相当于 Windows 的任务管理器。但很多人打开 top 后看得一头雾水,不知道各个数字代表什么意思。本文就把 top 命令的输出详解一遍,让你一眼就能看出服务器哪里出了问题。
启动 top 命令
直接在终端输入:
top
就能看到实时的系统监控界面。按 q 键退出。
top 输出详解
top 的输出分为两部分:上面是系统整体信息,下面是各个进程的详细列表。
第一行:系统概况
top - 10:30:45 up 30 days, 2:15, 1 user, load average: 0.50, 0.40, 0.30
10:30:45:当前系统时间up 30 days, 2:15:系统已经运行了30天2小时15分钟1 user:当前有1个用户登录load average: 0.50, 0.40, 0.30:系统负载,分别是1分钟、5分钟、15分钟的平均负载
负载怎么看? 负载数值和 CPU 核心数有关。比如4核CPU,负载4.0才算跑满;如果负载超过 CPU 核心数的70%就需要注意了。
第二行:任务进程
Tasks: 120 total, 1 running, 119 sleeping, 0 stopped, 0 zombie
120 total:总共有120个进程1 running:1个正在运行119 sleeping:119个休眠中0 stopped:0个停止0 zombie:0个僵尸进程
僵尸进程多了要注意,说明有进程没正常退出。
第三行:CPU 使用情况
%Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 92.0 id, 0.5 wa, 0.0 hi, 0.5 si, 0.0 st
us:用户态CPU占用百分比sy:内核态CPU占用百分比ni:改变过优先级的进程占用id:空闲CPU百分比wa:等待I/O的CPU百分比hi:硬中断占用si:软中断占用st:被虚拟机偷走的CPU时间
重点看 us 和 id: 如果 us 很高说明用户进程占了大量CPU;如果 wa 很高说明磁盘I/O是瓶颈。
第四行:内存使用
KiB Mem : 8165036 total, 2000000 free, 4000000 used, 2165036 buff/cache
total:总内存free:空闲内存used:已用内存buff/cache:缓存占用
注意: Linux 的内存管理机制和 Windows 不一样,free 很少不代表内存不够用,因为很多内存被用作缓存(buff/cache),需要的时候可以释放出来。
第五行:交换分区
KiB Swap: 2097148 total, 2097148 free, 0 used. 4000000 avail Mem
total:交换分区总大小free:空闲交换分区used:已用交换分区avail Mem:可用内存(包括可回收的缓存)
如果 Swap 用了很多,说明物理内存不够用了,系统在把内存数据换到磁盘上,这时候性能会大幅下降。
进程列表
下面是各个进程的详细列表,各列含义:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 100000 20000 5000 S 5.0 0.2 1:23.45 nginx
PID:进程IDUSER:进程所属用户PR:进程优先级NI:nice值,负值优先级高VIRT:虚拟内存占用RES:物理内存占用(常驻内存)SHR:共享内存S:进程状态(R运行/S睡眠/D不可中断睡眠/Z僵尸)%CPU:CPU占用百分比%MEM:内存占用百分比TIME+:累计CPU时间COMMAND:进程名
top 常用快捷键
在 top 界面里,可以按这些键进行交互:
| 按键 | 功能 |
|---|---|
P |
按CPU占用排序(默认) |
M |
按内存占用排序 |
N |
按PID排序 |
1 |
显示每个CPU核心的详细信息 |
k |
杀掉指定PID的进程 |
q |
退出top |
h |
显示帮助 |
d |
刷新间隔时间(秒) |
u |
只显示指定用户的进程 |
c |
显示完整命令行 |
实际排查案例
案例1:CPU 占用很高
打开 top,按 P 键按CPU排序,看哪个进程占的CPU最多。如果是某个异常进程,按 k 输入PID杀掉。
案例2:内存占用很高
按 M 键按内存排序,看哪个进程占的内存最多。如果是数据库占的内存多,那是正常的(数据库会把数据缓存到内存里)。
案例3:系统负载高但CPU不高
如果 load average 很高,但 %us 和 %sy 都不高,看看 %wa 是不是很高。如果 wa 高,说明是磁盘I/O瓶颈,CPU在等磁盘读写。
常见坑
坑1:把 buff/cache 当成已用内存
很多人看到 free 很少就慌了,觉得内存不够用。其实 Linux 把空闲内存都用来做缓存了,buff/cache 那部分是可以随时回收的。看 avail Mem 那列才是真正可用的内存。
坑2:load average 高就以为CPU不够
负载高不一定是CPU的问题。可能是磁盘I/O瓶颈(%wa高),也可能是大量进程在等待资源。要结合CPU使用率一起看。
坑3:杀进程杀错了
用 k 杀进程的时候一定要确认PID是不是对的,别把系统关键进程杀了。杀错了可能直接导致系统挂掉。
总结
top 命令是 Linux 运维最常用的监控工具,记住几个关键点:
- 看负载:
load average,和CPU核心数对比 - 看CPU:
%us高说明用户进程吃CPU,%wa高说明磁盘I/O瓶颈 - 看内存:看
avail Mem,不要只看free - 排序:按
P看CPU占用,按M看内存占用 - 杀进程:按
k输入PID
日常排查服务器问题,先打开 top 看一眼,大部分问题都能定位到方向。
遇到问题加QQ23979811 协助处理