线上cpu飙高排查之常用命令

平均负载

什么是平均负载?
是指单位时间内系统处于可运行状态(使用cpu或者等待cpu)或者不可中断状态的平均进程数

uptime命令

查看cpu的平均负载

[lciptv@ipcqa-02 ~]$ uptime
 23:11:02 up 15 days, 13:31,  3 users,  load average: 0.00, 0.00, 0.00
含义
23:11:02 系统时间
up 15 days, 13:31 系统运行时间
3 user 用户数
load average: 0.00, 0.00, 0.0 系统过去1分钟,5分钟,15分钟的平均负载

top交互命令

命令 含义
N 按PID由高到低排列
M 根据内存资源使用大小进行排序
P 根据CPU资源使用大小进行排序
c 显示完整的进程信息
1(数字) 显示每个逻辑CPU的详细情况

cpu状态信息:

top命令顶部.jpg
含义
us 用户态cpu使用的占比(没有通过 nice 调度)
sy 内核态cpu使用的占比
ni 改变过优先级的进程占用CPU的百分比,表示用户进程中,通过 CPU 调度(nice)过的使用时间
id 空闲cpu占比
wa IO等待占用CPU的百分比
hi 硬中断(Hardware IRQ)占用CPU的百分比
si 软中断(Software Interrupts)占用CPU的百分比

Cpu(s)与%CPU区别:

Cpu(s): us: 在一定的时间间隔内,用户空间占用CPU时间百分比,是多核心cpu的一个平均值。
%CPU:上次更新到现在的CPU时间占用百分比,多线程情况下,如果是多核,占比可能大于100%

内存信息:

  • free +buff/cache = 可用内存
  • buffer:写磁盘先将数据保存在磁盘缓冲区(buffer),然后写入磁盘
  • cache:将磁盘数据暂存在磁盘缓冲区(cache),供后续程序使用
  • avail Mem:可以分配和使用的内存量,而不会导致更多的交换
  • swap used:swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了

释放内存:

  • 管理内存的三种方式:

    0:是系统默认值,默认情况下表示不释放内存,由操作系统自动管理  
    1:释放页缓存 
    2:释放dentries和inodes
    3:释放所有缓存

  • 手动释放缓冲区的内存到free

(1)手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
(2)释放 echo 3 > /proc/sys/vm/drop_caches 
(3)如果现在想让操作系统重新分配内存,那么设置drop_caches的值为0即可 echo 0 > /proc/sys/vm/drop_caches

  • 操作系统释放缓冲区内存到free
top命令中部.jpg

PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

cpu上下文切换

什么是cpu上下文切换?
频繁的上下文切换,会将CPU都消耗在CPU上下文的保存和恢复上,导致任务运行时间变短,影响系统性能。

vmstat命令

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0   3084 472340   3352 12038260    0    0     4     2    9    3  0  0 100  0  0
含义
in 每秒中断的次数
cs 每秒上下文切换的次数

jstack命令

jstack命令工具可以得到线程堆栈信息,根据这些线程堆栈信息,我们可以去检查Java程序出现的问题,如检测死锁,并输出死锁的信息的排查

1、打印进程下面的线程列表

ps -mp pid(进程id) -o THREAD,tid(线程id),time

[lciptv@ipcqa-02 ~]$ ps -mp 126242 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM     TID     TIME
lciptv    0.1   -    - -         -      -       - 00:05:05
lciptv    0.0  19    - -         -      -  126242 00:00:00
lciptv    0.0  19    - -         -      -  126243 00:00:03

2、将需要的线程ID转换为16进制格式

printf "%x\n" tid(线程id)

[lciptv@ipcqa-02 ~]$ printf "%x\n" 126242
1ed22

3、打印线程的堆栈信息

jstack pid(进程id) |grep tid -A 100

jstack pid |grep tid -A 100

ps命令

  • aux 关注线程本身a:显示一个终端所有的进程u:显示进程的归属用户及内存使用情况x:显示没有关联控制终端的进程

  • axjf 关注线程之间的关系j:显示进程归属的进程组id、会话id、父进程idf:以ascii的形式显示出进程的层次关系

  • ef

    e:显示所有进程

    -f : 全格式

[lciptv@ipcqa-04 ~] $ ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 191204  3592 ?        Ss   6月27   0:40 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    6月27   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   6月27   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    6月27   0:02 [ksoftirqd/0]
  • USER:进程是哪个用户产生的

  • PID:进程的身份证号码

  • %CPU:指进程对CPU的占用率

  • %MEM:进程占用内存的百分比

  • VSZ:进程使用虚拟内存的大小

  • RSS:进程使用物理内存的大小

  • TTY:进程关联的终端

  • STAT:进程当前状态

    -D:不可被唤醒的睡眠状态,通常用于I/O情况
    -R:该线程正在运行
    -S:该线程处于睡眠状态,可被唤醒
    -T:停止状态,可能在后台暂停或者进程处于出错状态
    -X:死掉的进程
    -Z:僵尸状态
    -N:低优先级
    -l:多线程
    -+:位于后台
    
  • START:进程的启动时间

  • TIME:进程运行的时间

  • COMMAND:当前进程执行的是哪个程序

[lciptv@ipcqa-04 ~] $ ps -axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     4     0     0 ?           -1 S<       0   0:00  \_ [kworker/0:0H]

PPID:当前进程父进程的idPID:当前进程的idPGID:当前进程所在的进程组的IDSID:进程所在的会话的IDTTY:进程所关联的终端TPGID:判断进程是否为守护进程(-1则为守护进程)STAT:进程当前状态UID:用户ID,记录进程是哪个用户启动的TIME:进程运行的时间COMMAND:记录进程之间的层次关系(和上边不同)

ps -ef | grep java 命令详解

[lciptv@ipcqa-04 ~] $ ps -ef | grep java
lciptv    2948     1  0 6月27 ?        00:20:40 /home/lciptv/app/jdk8/bin/java -classpath . -Dtarget=cqcu_serviceauth-service -Dspring.profiles.active=dev -jar iptv.serviceauth-4.0.0.BUILD-SNAPSHOT.jar

UID :程序被该 UID 所拥有
PID :就是这个程序的 ID
PPID :则是其上级父程序的ID
C :CPU使用的资源百分比
STIME :系统启动时间
TTY :登入者的终端机位置
TIME :使用掉的CPU时间
CMD :所下达的是什么指令

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容