服务器上查看程序占用的CPU和内存,Linux优先掌握top、ps、free三个命令,Windows用任务管理器或PowerShell即可;先看整机指标,再按CPU或内存排序定位到具体进程。
服务器上怎么看程序占的CPU和内存:先整机后单进程
很多运维和开发第一次接触服务器时,习惯直接敲top,眼睛盯着%CPU和%MEM看,这样做没错,但容易忽略一个大前提:整机资源还没看,就急着给某个进程下结论,正确顺序是先看整机压力,再从排行里找异常进程。
第一步用uptime和free -h看整机压力
uptime命令会输出当前时间、运行时长、登录用户数,以及三个load average值,这三个值分别代表1分钟、5分钟、15分钟的平均负载,平均负载指队列中正在运行和等待CPU的进程数量,不是CPU使用率,单核服务器上负载持续高于1,说明有进程在排队等CPU;多核服务器要结合核数判断,8核机器负载为6并不算严重。
free -h输出中要重点看available列,used高不代表没内存可用,因为Linux会大量使用内存做文件和目录缓存,available才是更接近“现在还能给新程序分配多少内存”的指标。
这里就涉及一个很常见的混淆点:服务器负载高和cpu占用高区别,CPU占用高表示某个或某些核心正在满负荷执行指令;负载高表示等待CPU的进程多,可能是CPU忙不过来,也可能是进程卡在磁盘IO上根本没占用多少CPU,排查时不能只盯CPU使用率。
| 指标 | 含义 | 高代表什么 |
|---|---|---|
| CPU使用率 | 核心正在执行指令的时间占比 | 计算密集或大量系统调用 |
| load average | 运行中+等待CPU的进程数 | CPU排队或IO等待 |
| available内存 | 可分配给新进程的内存量 | 内存是否真正紧张 |
用top或htop看进程占用排序
top是绝大多数Linux服务器自带工具,默认每3秒刷新一次,进入top后,按P可以把进程按CPU使用率降序排序,按M按内存使用率降序排序,按c显示完整启动命令行,按1展开每个物理核心,重点关注%CPU、%MEM、RES和TIME+四列,htop交互更友好,支持鼠标点击列头排序,但部分精简服务器需要额外安装。
linux查看进程cpu占用排行:top和ps命令实战
top交互命令下的排行
登录服务器后直接运行:
top
然后按P键,进程列表会按CPU占用从高到低排列,多核机器上%CPU可以超过100%,表示进程同时占用了多个核心,比如显示240%代表大约占满2.4个核,按M键则切换为内存排序,看到哪些进程吃内存最多,按q退出。
想要看完整启动命令,可以运行:
top -c
这样发生问题时,能直接看到是哪个脚本、哪个Java服务还是哪个数据库进程在消耗资源。
ps命令一次性输出排行
top适合实时看,ps适合一次性快照或写脚本采集,默认很多服务器一定带ps,哪怕没有top,常用命令如下:
ps aux --sort=-%cpu | head -n 20 ps aux --sort=-%mem | head -n 20
第一条按CPU降序取前20行,第二条按内存降序取前20行,aux表示显示所有用户进程,–sort=-%cpu中的负号表示降序,如果命令被截断,可以加-ww查看完整命令。
| 工具 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| top | 实时互动排查 | 按键排序灵活,信息全 | 默认展示列有限 |
| ps | 一次性快照、脚本采集 | 命令简单,可管道处理 | 非实时 |
| htop | 可视化实时监控 | 界面友好,支持鼠标 | 需要额外安装 |
服务器内存占用高怎么排查:从整机内存结构入手
先看free -h的available和buff/cache
很多人看到free -h里used比例很高就紧张,其实多数情况下是Linux把空闲内存拿去做缓存了,buff/cache是内核缓存文件数据用的,程序需要内存时会自动回收一部分,不会立刻触发OOM,只有当available很小、swap使用持续增大时,才说明内存真正紧张。
行业共识认为,内存高占用要先看buff/cache是否占大头,再定位单进程,排查命令:
free -h cat /proc/meminfo | grep -E 'MemTotal|MemFree|MemAvailable|Buffers|Cached|Shmem'
定位高内存进程
确认内存确实紧张后,排序找进程:
ps aux --sort=-%mem | head -n 25
注意RSS列是实际物理内存,包含共享库部分,多个进程共享的库会被重复计入RSS,所以单个进程RSS高不一定独占那么多物理内存,容器环境下建议直接用:
docker stats --no-stream
这样看到的是容器级别的内存占用,更像真实使用情况,对于Java程序,RSS比-Xmx大属于正常现象,因为堆外内存、元空间和线程栈都不在Xmx范围内,只有内存持续增长且不回落,才结合GC日志判断是否泄漏。
服务器cpu占用100%怎么定位:从进程到线程
定位进程后进一步看线程
先通过top按P键找到CPU占用最高的进程,记录PID,接着查看该进程内部是哪个线程在消耗CPU:
top -H -p PID
在top界面继续按P键,就能看到线程级CPU排行,对于Java应用,把线程TID转成十六进制,再用jstack PID分析栈信息,非Java程序可以用:
strace -p PID
观察程序在反复执行什么系统调用,如果是空转计算,会看到大量普通指令无阻塞;如果是IO问题,会看到read/write调用耗时较长。
CPU占用100%不要只看user态
top中us表示用户态CPU,sy表示内核态CPU,wa表示IO等待,如果wa很高,说明程序在等磁盘IO,CPU并没有真正忙碌,单进程把单核打满时,多核服务器的整体使用率可能只显示较小区间,按1键展开多核视图,才能看到哪个核已经被堵住。
Windows服务器查看进程内存和CPU的常用方式
Windows服务器查看进程内存:任务管理器与PowerShell
Windows服务器操作比Linux直观,打开任务管理器,切换到“详细信息”页,右键点击列标题,勾选CPU和内存列,再点击对应列头即可排序,CPU显示的是使用率百分比,内存显示的是工作集。
命令行方式便于批量采集:
Get-Process | Sort-Object CPU -Descending | Select-Object -First 20 Name,CPU,WS Get-Process | Sort-Object WS -Descending | Select-Object -First 20 Name,CPU,WS
WS即Working Set,表示进程当前占用的物理内存量,也可以用性能计数器持续监控:
Get-Counter 'Process()% Processor Time'
没有top命令怎么查看内存和CPU占用
没有top命令怎么查看内存和CPU占用:proc文件系统兜底
标准Linux一定有/proc虚拟文件系统,ps被精简掉的可能性极低,但某些容器镜像可能连ps都没有,此时可以直接读/proc:
cat /proc/meminfo cat /proc/stat
/proc/meminfo显示整机内存分布,重点看MemTotal、MemFree、MemAvailable、Buffers、Cached。/proc/stat显示CPU总时间,包括user、nice、system、idle、iowait等,手动算两次差值能得到粗略使用率,但更适合脚本化。
如果只需要看某个进程的CPU和内存,可以读:
cat /proc/PID/status cat /proc/PID/stat
status文件中VmRSS对应该进程物理内存,stat文件中的第14、15个字段是用户态和内核态CPU时间,容器内部没有任何工具时,宿主机运行docker stats --no-stream是最快的方式。
宝塔面板怎么看程序占用资源
国内很多简米云、酷番云服务器会安装宝塔面板维护站点,宝塔面板登录后在首页或“监控”模块能看到服务器实时CPU和内存使用曲线,但面板图形只能看到整机趋势,看不到具体哪个PHP进程或MySQL查询占资源,精确定位仍需要在面板自带的“终端”里运行top、ps命令,面板适合日常观察趋势,命令行适合故障当场的精准定位。
排查服务器程序CPU和内存占用,核心就是先看整机,再按CPU或内存排序定位进程。 Linux优先用top和ps,Windows优先用任务管理器和PowerShell,精简环境用/proc和docker stats,不用记住所有参数,先掌握按P、按M和ps aux --sort=-%cpu,就能解决大部分日常问题。
服务器上怎么看程序占的cpu和内存最简单的方法是什么?
登录Linux运行top,按P看CPU排行,按M看内存排行;Windows打开任务管理器详细信息页,点击CPU或内存列头排序,两条命令足够覆盖多数场景。
服务器内存占用高怎么排查才不漏掉异常进程?
先看free -h确认available是否真正紧张,再看ps aux –sort=-%mem前20个进程,如果buff/cache占大头可以先排除,容器环境用docker stats,同时查看/proc/meminfo中的Shmem和swap使用趋势。
服务器cpu占用100%怎么定位,和负载高有什么区别?
CPU占用100%表示某些核心正处于满负荷;负载高表示等待CPU的进程多,也可能是磁盘IO导致进程堆积,先用top -H -p PID找到占用高的线程,再结合jstack或strace分析具体代码路径。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/678404.html





