Linux系統調優——CPU(一)

(1).系統調優思路html

  性能優化就是找到系統處理中的瓶頸以及去除這些的過程,性能優化實際上是對OS 各子系統達到一種平衡的定義。具體步驟以下:linux

  1. 系統的運行情況:  CPU -> MEM  -> DISK->  NETWORK -> applicationios

  2. 分析是否有瓶頸(依據當前應用需求)vim

  3. 調優(採起必定措施使變得優異)api

  這些子系統之間關係是相互彼此依賴的,任何一個高負載都會致使其餘子系統出現問題.好比:性能優化

    大量的網頁調入請求致使內存隊列的擁塞;服務器

    網卡的大吞吐量可能致使更多的 CPU 開銷;app

    大量的 CPU 開銷又會嘗試更多的內存使用請求;ssh

    大量來自內存的磁盤寫請求可能致使更多的 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:

  詳細信息查看:http://www.javashuo.com/article/p-eohwqlbq-cb.html

(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
相關文章
相關標籤/搜索