平均负载
什么是平均负载?
是指单位时间内系统处于可运行状态(使用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状态信息:
值 | 含义 |
---|---|
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
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 :所下达的是什么指令