(1).系统调优思路
性能优化就是找到系统处理中的瓶颈以及去除这些的过程,性能优化其实是对OS 各子系统达到一种平衡的定义。具体步骤如下:
1. 系统的运行状况: CPU -> MEM -> DISK-> NETWORK -> application
2. 分析是否有瓶颈(依据当前应用需求)
3. 调优(采取一定措施使变得优异)
这些子系统之间关系是相互彼此依赖的,任何一个高负载都会导致其他子系统出现问题.比如:
大量的网页调入请求导致内存队列的拥塞;
网卡的大吞吐量可能导致更多的 CPU 开销;
大量的 CPU 开销又会尝试更多的内存使用请求;
大量来自内存的磁盘写请求可能导致更多的 CPU 以及 IO 问题;
所以要对一个系统进行优化,查找瓶颈来自哪个方面是关键,虽然看似是某一个子系统出现问题,其实有可能是别的子系统导致的。调优就像医生看病,因此需要你对服务器所有地方都了解清楚。
(2).查看CPU负载相关工具
1)uptime
[root@youxi1 ~]# uptime
14:57:14 up 45 min, 1 user, load average: 0.00, 0.01, 0.05
说明如下:
14:57:14 | 当前系统时间 |
up 45 min | 系统运行时间 |
1 user | 当前登录用户数 |
| 平均负载,即任务队列的平均长度。三个数值分别是:1分钟前、5分钟前、15分钟前到现在的平均值 |
详细查看:Linux命令之uptime
2)top
输入top命令,按下大写的P,可以使输出按照CPU的使用率进行排序。top命令使用在CPU方面时,可以查看到CPU的各种信息,但更多的是用于找出使用CPU最多的程序。
详细查看:Linux命令之top
3)ps
按照实际使用CPU,从大到小显示所有进程列表。可以用于找出使用CPU最多的程序
[root@youxi1 ~]# ps aux --sort -pcpu | more //按CPU降序排序
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 125348 3780 ? Ss 14:12 0:01 /usr/lib/syste
md/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 14:12 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 14:12 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 14:12 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 14:12 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 14:12 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 14:12 0:00 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 14:12 0:00 [lru-add-drain
]
root 11 0.0 0.0 0 0 ? S 14:12 0:00 [watchdog/0]
root 13 0.0 0.0 0 0 ? S 14:12 0:00 [kdevtmpfs]
root 14 0.0 0.0 0 0 ? S< 14:12 0:00 [netns]
root 15 0.0 0.0 0 0 ? S 14:12 0:00 [khungtaskd]
root 16 0.0 0.0 0 0 ? S< 14:12 0:00 [writeback]
root 17 0.0 0.0 0 0 ? S< 14:12 0:00 [kintegrityd]
root 18 0.0 0.0 0 0 ? S< 14:12 0:00 [bioset]
root 19 0.0 0.0 0 0 ? S< 14:12 0:00 [kblockd]
root 20 0.0 0.0 0 0 ? S< 14:12 0:00 [md]
--More--
注意:pcpu前面有减号是降序,没有减号是升序。
4)mpstat
这个命令需要安装,直接yum安装就好。
[root@youxi1 ~]# yum -y install sysstat
[root@youxi1 ~]# mpstat
Linux 3.10.0-862.el7.x86_64 (youxi1) 2019年07月29日 _x86_64_ (1 CPU)
17时01分17秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
17时01分17秒 all 0.13 0.00 0.25 0.05 0.00 0.00 0.00 0.00 0.00 99.56
说明如下:
CPU | 处理器编号,all表示统计信息计算为所有处理器之间的平均值 |
%usr | 显示在用户级(应用程序)执行时发生的CPU利用率百分比。也叫用户态 |
%nice | 显示以优先级较高的用户级别执行时发生的CPU利用率百分比。 |
%sys | 显示在系统级(内核)执行时发生的CPU利用率百分比。也叫内核态 注意:这不包括维护硬件和软件的时间中断。 |
%iowait | 显示系统具有未完成磁盘I / O请求的CPU或CPU空闲的时间百分比。 |
%irq | 显示CPU或CPU用于服务硬件中断的时间百分比。 |
%soft | 显示CPU或CPU用于服务软件中断的时间百分比。 |
%steal | 显示在虚拟机管理程序服务另一个虚拟处理器时虚拟CPU或CPU无意中等待的时间百分比。 |
%guest | 显示CPU或CPU运行虚拟处理器所花费的时间百分比。 |
%gnice | 显示CPU或CPU运行来宾所花费的时间百分比。 |
%idle | 显示CPU或CPU空闲且系统没有未完成的磁盘I / O请求的时间百分比。 |
使用mpstat -P ALL查看所有CPU运行状态
[root@youxi1 ~]# mpstat -P ALL
Linux 3.10.0-862.el7.x86_64 (youxi1) 2019年07月30日 _x86_64_ (1 CPU)
11时11分19秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11时11分19秒 all 0.09 0.00 0.23 0.07 0.00 0.00 0.00 0.00 0.00 99.61
11时11分19秒 0 0.09 0.00 0.23 0.07 0.00 0.00 0.00 0.00 0.00 99.61
使用mpstat 1 10命令查看CPU运行状态,1秒刷新1次,连续刷新10次
[root@youxi1 ~]# mpstat 1 10
Linux 3.10.0-862.el7.x86_64 (youxi1) 2019年07月30日 _x86_64_ (1 CPU)
11时13分39秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11时13分40秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时13分41秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时13分42秒 all 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00
11时13分43秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时13分44秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时13分45秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时13分46秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时13分47秒 all 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00
11时13分48秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时13分49秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: all 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.80
(3).查看CPU的信息
cpu的信息存放在/proc/cpuinfo文件中
[root@youxi1 ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
stepping : 9
microcode : 0x12
cpu MHz : 3192.819
cache size : 6144 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm
constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt
tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm epb fsgsbase tsc_adjust smep dtherm ida arat pln pts
bogomips : 6385.63
clflush size : 64
cache_alignment : 64
address sizes : 42 bits physical, 48 bits virtual
power management:
详细信息查看:https://blog.csdn.net/cuker919/article/details/7635488
(4).CPU资源的简单调优
1)调整nice值改变进程优先级
在Linux系统中,nice值的范围从-20到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的程序,其nice值最低,所以在Linux系统中,值-20使得一项任务变得非常重要;与之相反,如果任务的nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的CPU时间的更大使用份额,这也就是nice的名称的来意。默认优先级是0。
可以在运行命令前,设置进程的nice值,让进程使用更多的CPU。nice -n [nice值] [完整命令]
[root@youxi1 ~]# nice -n -5 vim a.txt
//另外打开一个窗口,查看vim a.txt的nice值
[root@youxi1 ~]# ps aux | grep vim //先查看vim a.txt的PID
root 1877 0.1 0.5 151560 5028 pts/0 S<+ 13:53 0:00 vim a.txt
root 1900 0.0 0.0 112720 980 pts/1 R+ 13:53 0:00 grep --color=auto vim
[root@youxi1 ~]# top -p 1877 //然后根据PID查看进程信息
top - 13:54:53 up 4:34, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 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 : 997956 total, 705368 free, 146968 used, 145620 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 689988 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1877 root 15 -5 151560 5028 2664 S 0.0 0.5 0:00.07 vim
还可以使用renice修改当前进程的nice值。renice -n [nice值] [PID]
[root@youxi1 ~]# renice -n 6 1877
1877 (进程 ID) 旧优先级为 -5,新优先级为 6
[root@youxi1 ~]# top -p 1877
top - 14:01:33 up 4:41, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 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 : 997956 total, 705316 free, 146828 used, 145812 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 689964 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1877 root 26 6 151560 5028 2664 S 0.0 0.5 0:00.07 vim
2)设置进程的CPU亲和力(指定进程运行在哪一个CPU上)
这里我将主机的CPU改为单个4核,内存也调整为4G。
使用的是taskset命令,安装的是util-linux。taskset在多核的情况下,可以指定进程在那个CPU上运行,减少进程在不同CPU之间切换的开销。
[root@youxi1 ~]# yum -y install util-linux
[root@youxi1 ~]# mpstat -P ALL
Linux 3.10.0-862.el7.x86_64 (youxi1) 2019年07月30日 _x86_64_ (4 CPU)
15时34分33秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
15时34分33秒 all 0.09 0.00 0.19 0.10 0.00 0.00 0.00 0.00 0.00 99.62
15时34分33秒 0 0.08 0.00 0.25 0.10 0.00 0.00 0.00 0.00 0.00 99.57
15时34分33秒 1 0.10 0.00 0.22 0.16 0.00 0.00 0.00 0.00 0.00 99.52
15时34分33秒 2 0.14 0.00 0.18 0.07 0.00 0.00 0.00 0.00 0.00 99.61
15时34分33秒 3 0.05 0.00 0.11 0.08 0.00 0.00 0.00 0.00 0.00 99.76
指定命令运行在第2个CPU上(CPU编号为1)。taskset -c [CPU编号] [完整命令]
[root@youxi1 ~]# taskset -c 1 vim a.txt
//另外打开一个窗口,查看vim a.txt运行的CPU
[root@youxi1 ~]# ps aux | grep vim
root 1528 0.5 0.1 151548 5048 pts/0 S+ 15:49 0:00 vim a.txt
root 1556 0.0 0.0 112720 980 pts/1 S+ 15:50 0:00 grep --color=auto vim
[root@youxi1 ~]# taskset -cp 1528
pid 1528's current affinity list: 1
查看进程运行在哪几个CPU上。taskset -cp [PID]
[root@youxi1 ~]# ps axu | grep sshd
root 1143 0.0 0.1 112796 4288 ? Ss 14:52 0:00 /usr/sbin/sshd -D
root 1460 0.0 0.1 161396 6016 ? Ss 15:26 0:00 sshd: root@pts/0
root 1562 0.0 0.0 112720 980 pts/0 S+ 15:55 0:00 grep --color=auto sshd
[root@youxi1 ~]# taskset -cp 1143
pid 1143's current affinity list: 0-3
[root@youxi1 ~]# taskset -cp 1460
pid 1460's current affinity list: 0-3
当然也可以设置命令在多个CPU上运行,CPU编号之间用逗号隔开。
[root@youxi1 ~]# taskset -c 1,3 vim b.txt
//另外打开一个窗口,查看vim b.txt运行的CPU
[root@youxi1 ~]# ps aux | grep vim
root 1566 0.3 0.1 151560 5028 pts/0 S+ 15:59 0:00 vim b.txt
root 1589 0.0 0.0 112720 984 pts/1 S+ 15:59 0:00 grep --color=auto vim
[root@youxi1 ~]# taskset -cp 1566
pid 1566's current affinity list: 1,3