(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 | 當前登錄用戶數 |
load average: 0.00, 0.01, 0.05 |
平均負載,即任務隊列的平均長度。三個數值分別是: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