1.系统调优的概述
1.1系统调优
- 系统的运行状况:CPU->MEM->DISK->NETWORK->用用程序调优
- 分析是否存在瓶颈(依据当前需求)
- 调优(把错误的调正确,低效率的调高效率)
1.2性能调优
性能调优就是找到系统处理瓶颈以及去除这些的过程。
性能优化其实是对os各子系统达到一种平衡的定义,这些子系统包括:
- CPU
- MEM
- IO
- NETWORK
这些子系统之间的关系是相互彼此依赖的,任何一个高负载都会导致其他子系统出现问题
比如:
- 大量的网页调入请求导致内存队列的拥塞;
- 网卡的大量吞吐可能导致CPU开销;
- 大量的CPU开销又会尝试更多的内存使用请求;
- 大量来自内存的磁盘写请求可能导致更多的CPU以及IO问题;
所以要对一个子系统进行优化,查找瓶颈来自于那个方向是关键,虽然看似是某一个子系统出现问题,器使有可能是别的子系统出现问题导致的。
调优就像医生看病,因此需要我们对服务器所有地方了解非常清楚。
当系统出现问题,运行卡,如何快速找出一下问题(进程):
- 找出系统中使用CPU最多的进程?
- 找出系统中使用内存最多的进程?
- 找出系统中对磁盘读写最多的进程?
- 找出系统中使用网路最多的进程?
查看CPU负载相关工具,找出系统中使用CPU最多的进程
1.查看CPU负载相关工具
示例1:找出系统中使用CPU最多的进程?
uptime 命令
$ uptime
22:08:04 up 2 days, 2:59, 1 user, load average: 0.00, 0.01, 0.05
# 22:08:04 当前时间
# up 2 当前系统运行时间,说明此服务器运行了2天
# 1 users 当前登录的用户数
# load average: 0.00,0.01,0.05 系统负载值,三个数值分别为:1、5、15分钟平均负载
例1:
找出当前系统中,CPU负载过高的服务器?
服务器1: load average: 0.00, 0.01, 0.05 1核
服务器2: load average: 4.00, 6.01, 6.05 1核
服务器3: load average: 10.00, 10.01, 10.05 4核
答案:服务器2
如果服务器的CPU为1核,则load average 中的数字 >= 3 负载过高,如果服务器CPU为4核,则load average 中的数字 >= 12 负载过高.
经验: 单核心,1分钟的系统平均负载不要超过3,就可以,这是个经验值。
系统负载,就是任务队列的平均长度。
任务队列的平均长度是什么?
就以大厅排队买票。
uptime命令获取的负载是从/proc/loadavg这个文件中获取的值
[root@c7-45 ~]# cat /proc/loadavg
0.00 0.01 0.05 1/234 32239
示例2.找出系统中使用CPU最多的进程
1.使用top命令
$ top 运行top命令,按大写的P:
top - 22:32:33 up 2 days, 3:23, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 135 total, 2 running, 133 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 6154100 total, 2546724 free, 551976 used, 3055400 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 5281276 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28445 root 20 0 0 0 0 R 1.6 0.0 0:06.60 kworker/0:2
1 root 20 0 43968 4324 2584 S 0.0 0.1 0:05.59 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.07 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.78 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.24 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:12.95 rcu_sched
2.使用ps命令
$ ps -aux --sort -pcpu | more #使用空格翻页 使用-pcpu可以显示出进程的绝对路径,方便中出木马程序运行路径。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2098 0.4 0.7 598416 48176 ? Ssl Sep10 13:30 /usr/bin/containerd
root 1 0.0 0.0 43968 4324 ? Ss Sep10 0:05 /usr/lib/systemd/systemd --switched-root --system --deseria
lize 22
root 2 0.0 0.0 0 0 ? S Sep10 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Sep10 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S Sep10 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S Sep10 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S Sep10 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S Sep10 0:12 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< Sep10 0:00 [lru-add-drain]
查看ps帮助文档
$ man ps
C pcpu cpu utilization (utilization 翻译为利用率)
查看cpu信息
$ cat /proc/cpuinfo
model name : Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz
cpu MHz : 2304.001
physical id : 0
cpu cores : 2
3.top命令详解
3.1 系统运行时间和平均负载
top - 22:44:39 up 2 days, 3:35, 1 user, load average: 0.00, 0.01, 0.05
#参考uptime的解释说明
3.2. 任务
Tasks: 135 total, 1 running, 134 sleeping, 0 stopped, 0 zombie
#Tasks是任务(进程),
#系统总共有105个任务,
#1个正在运行,
#134个休眠状态,
#0个停止,
#0个是僵尸状态。
3.3 Cpu状态
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
按下数字1,查看CPU核数,核数编号从0开始,所以根据下图可知,该系统cpu核数为2,
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# us: 运行(未调整优先级的)用户进程的cpu时间
# sy: 系统运行内核进程CPU时间
# ni: 运行已调整优先级的用户进程的CPU时间
# wa: 用于等待IO完成的CPU时间
# hi: 处理硬件中断的CPU时间
# si:处理关键中断的CPU时间
# st: 这个虚拟机被 hypervisor偷取的cpu时间
3.4内存使用的状况
KiB Mem : 6154100 total, 2544160 free, 552524 used, 3057416 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 5280728 avail Mem
Swap: 交换分区。就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。一般为内存的两倍大小(1.5到2倍)。
Mem:
6154100 total : 物理内存的总量
2544160 free :空闲内存的总量
552524 used :使用中的内存总量
3057416 buff/cache : 缓存内存量
3.5各个进程(任务)的状态监控
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2098 root 20 0 598416 48176 15148 S 0.3 0.8 13:39.29 containerd
1 root 20 0 43968 4324 2584 S 0.0 0.1 0:05.61 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.07 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.79 ksoftirqd/0
# PID: 进程ID.进程的唯一标识符
# USER: 进程所有者的实际用户名
# PR: 进程调度优先级。这个字段的一些值是“rt”。这意味着这些进程运行在实时态。
# NI: 进程的优先级(nice值),值越小,优先级越高
# VIRT: 进程使用的虚拟内存,进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
# RES: 驻留内存大小。驻留内存是任务使用的非交换物理内存的大小。进程使用的,未被换出的物理内存大小,单位kb.RES=CODE+DATA
# SHR: 是进程使用的共享内存,单位Kb。
# S: 这个是进程的状态:
R - 运行态
S - 睡眠态
T - 被跟踪或已停止
Z - 僵尸态
D - 不可中断的睡眠态
# %CPU : 自从上一次更新时到现在任务所使用的CPU时间的百分比
# %MEM : 进程使用可用物理内存百分比
# TIME+ : 任务启动后到现在所有使用的全CPU时间,精确到百分之秒
# COMMAND : 运行进程所使用的命令
3.6 CPU专用命令mpstat
1. 查看cpu运行情况
$ mpstat
Linux 3.10.0-1062.el7.x86_64 (c7-45) 09/12/2020 _x86_64_ (2 CPU)
11:14:18 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:14:18 PM all 0.03 0.00 0.11 0.00 0.00 0.00 0.00 0.00 0.00 99.86
# CPU : all 表示所有CPU处理情况,数字表述CPU核ID
# usr : 用户空间CPU使用占比
# nice: 优先级进程使用CPU的占比
# sys: 内核空间CPU使用占比
# iowait: CPU等待IO占比
# irq : CPU处理硬中断占比
# soft : CPU处理软中断占比
# steal和guest与虚拟机有关,暂不涉及
2. 查看所有cpu运行状态
$ mpstat -P ALL
Linux 3.10.0-1062.el7.x86_64 (c7-45) 09/12/2020 _x86_64_ (2 CPU)
11:19:37 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:19:37 PM all 0.03 0.00 0.11 0.00 0.00 0.00 0.00 0.00 0.00 99.86
11:19:37 PM 0 0.03 0.00 0.11 0.00 0.00 0.00 0.00 0.00 0.00 99.86
11:19:37 PM 1 0.03 0.00 0.11 0.00 0.00 0.00 0.00 0.00 0.00 99.86
3. 每一秒刷新一次,连续刷新3次
$ mpstat -P ALL 1 3
Linux 3.10.0-1062.el7.x86_64 (c7-45) 09/12/2020 _x86_64_ (2 CPU)
11:21:19 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:21:20 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11:21:20 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11:21:20 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11:21:20 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:21:21 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11:21:21 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11:21:21 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11:21:21 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:21:22 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11:21:22 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11:21:22 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
查看Memory负载相关工具,找出系统中使用内存最多的进程
1.使用 free 命令查看内存
$ free
total used free shared buff/cache available
Mem: 6154100 551816 2544788 22828 3057496 5281436
Swap: 2097148 0 2097148
$ free -h #表示给数值单位展示
total used free shared buff/cache available
Mem: 5.9G 538M 2.4G 22M 2.9G 5.0G
Swap: 2.0G 0B 2.0G
total 容量总数
used 已使用的容量
free 空余容量
shared 共享容量
buffers 缓冲,通常缓冲元数据(读入缓冲)
cached 缓存,通常缓存数据(写入缓存)
ps: 针对与buff,cache,当物理内存不够用的时候,内核会把非活跃的数据清空
2.通过 /proc/meminfo 查看非活跃的数据内存
$ cat /proc/meminfo
MemTotal: 6154100 kB
MemFree: 2543908 kB
MemAvailable: 5280564 kB
Buffers: 2108 kB
Cached: 2827176 kB
SwapCached: 0 kB
Active: 945364 kB #活跃内存,指的是进程一致读写的内存空间
Inactive: 2097444 kB #非活跃内存
Active(anon): 199880 kB
Inactive(anon): 36504 kB
Active(file): 745484 kB
Inactive(file): 2060940 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Dirty: 24 kB
Writeback: 0 kB
AnonPages: 213424 kB
Mapped: 105004 kB
Shmem: 22860 kB
Slab: 386608 kB
SReclaimable: 228252 kB
SUnreclaim: 158356 kB
KernelStack: 5808 kB
PageTables: 7896 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 5174196 kB
Committed_AS: 1849360 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 191240 kB
VmallocChunk: 34359310332 kB
HardwareCorrupted: 0 kB
AnonHugePages: 94208 kB
ps:当内存不够用的时候,kernel(内核)总是把不活跃的内存交换到swap空间,如果inactive内存多时,加swap空间可以解决问题,而active多,则考虑加内存。
3. 找出系统中使用内存最多的进程?
3.1使用top
$ top #运行top,然后按下大写M可以按照内存使用率来排序了
top - 23:40:05 up 2 days, 4:31, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 138 total, 1 running, 137 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 6154100 total, 2542788 free, 553732 used, 3057580 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 5279488 avail Mem
Change delay from 3.0 to
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2862 root 20 0 609100 100000 30524 S 0.0 1.6 1:51.71 dockerd
2098 root 20 0 598416 48176 15148 S 0.3 0.8 13:52.77 containerd
1655 root 20 0 574200 17444 6116 S 0.0 0.3 0:16.41 tuned
4379 102 20 0 244852 16088 14740 S 0.0 0.3 0:00.28 postgres
3103 root 20 0 122756 15436 7336 S 0.0 0.3 0:15.47 registry
3.2 使用 ps
ps -aux --sort -rss | more
ps -aux --sort -rss | head -n 10
ps -aux --sort -rss > /root/a.log