① 為什麼linux的並發間隔那麼短
交替輸出,這正是並發的特徵。並發就是要在極短的時間內 將CPU的時間片輪流分配給不同的進程,使得宏觀上看起來每一個進程都在同時運行。
至於進程的上下文切換,一般情況下都不需要考慮它的性能消耗。不過在進程上下文切換次數較多的情況下(比如IO密集型系統),確實會對系統性能產生一定的影響。
② linux中什麼是時間片
時間片,簡單來說就是CPU分配給各個程序的時間,使各個程序從表面上看是同時進行的,而不會造成CPU資源浪費。
時間片輪轉調度中唯一有趣的一點是時間片的長度。從一個進程切換到另一個進程是需要一定時間的--保存和裝入寄存器值及內存映像,更新各種表格和隊列 等。
假如進程切換(process switch) - 有時稱為上下文切換(context switch),需要5毫秒,再假設時間片設為20毫秒,則在做完20毫秒有用的工作之後,CPU將花費5毫秒來進行進程切換。CPU時間的20%被浪費 在了管理開銷上。
③ linux進程切換如何保存的執行現場
點擊保存即可。
_扇∠嚶Φ牡鞫人惴ɡ湊業較亂桓鮃蔥械娜撾? 進行任務的狀態指示的改變 真正的任務上下文切換。
④ linux cpu佔用較高
Linux伺服器上出現CPU負載達到100%居高不下的情況,如果CPU 持續跑高,則會影響業務系統的正常運行; CPU利用率。根據經驗來看,用戶空間進程佔用CPU比例在 65-70%。一般不能超過這個比例,超過這個比例,系統性能就會降低,平均負載升高,這點將會在下面的測試中看到。
進程上下文切換。上下文切換和CPU利用率應該聯系起來,如果CPU利用率低,那麼上下文切換稍高點也能接受。上下文切換也是需要消耗CPU資源的,頻繁的切換必將使得CPU利用率升高。
運行隊列中等待運行的進程數。每個CPU核心中等待處理的進程數不應該超過3個線程/進程。如4核心的機器,那麼隊列的最大值應該不超過12個。
對於CPU過載問題通常使用以下兩種方式即可快速定位(不能涵蓋所有特殊情況,請作為其中的參考排查思路):
一、排查分析
方法一(針對java應用):
第一步:使用
top命令,然後按shift+p按照CPU排序
找到佔用CPU過高的進程的pid
第二步:使用
top -H -p [進程id]
找到進程中消耗資源最高的線程的id
第三步:使用
echo 'obase=16;[線程id]' | bc或者printf "%x\n" [線程id]
將線程id轉換為16進制(字母要小寫)
bc是linux的計算器命令
第四步(此步驟可以和相對應的java開發進行一起排查):執行
jstack [進程id] |grep -A 10 [線程id的16進制]」
查看線程狀態信息
二、kswapd0 進程佔用 CPU 較高
操作系統都用分頁機制來管理物理內存,操作系統將磁碟的一部分劃出來作為虛擬內存,由於內存的速度要比磁碟快得多,所以操作系統要按照某種換頁機制將不需要的頁面換到磁碟中,將需要的頁面調到內存中,由於內存持續不足,這個換頁動作持續進行,kswapd0 是虛擬內存管理中負責換頁的,當伺服器內存不足的時候 kswapd0 會執行換頁操作,這個換頁操作是十分消耗主機 CPU 資源的。如果通過 top 發現該進程持續處於非睡眠狀態,且運行時間較長,可以初步判定系統在持續的進行換頁操作,可以將問題轉向內存不足的原因來排查。
⑤ Linux裡面vmstat命令作用是什麼
11.5 vmstat:虛擬內存統計
11.5.1 命令詳解
【命令星級】 ★★★★☆
【功能說明】
vmstat是Virtual Memory Statistics(虛擬內存統計)的縮寫,利用vmstat命令可以對操作系統的內存信息、進程狀態和CPU活動等進行監視。但是只能對系統的整體情況進行統計,無法對某個進程進行深入分析。
【語法格式】
vmstat [option] [delay [ count]]
vmstat [選項] [時間間隔[次數]]
說明:
1)在vmstat命令及後面的選項里,每個元素之間都至少有一個空格。
2)delay表示兩次輸出之間的間隔時間。
3)count表示按照delay指定的時間間隔統計的次數。
【選項說明】
表11-4針對該命令的參數選項進行了說明。
11.5.2 使用範例
範例11-12:顯示虛擬內存使用情況。
[root@oldboy ~]# vmstat #<==如果省略「間隔時間」和「次數」參數,則僅顯示一次報告後就退出
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 71756 38600 279084 0 0 24 6 15 18 0 0 100 0 0
[root@oldboye ~]# vmstat 5 #<==表示每5秒鍾更新一次輸出信息,循環輸出,按Ctrl+C組合鍵停止輸出。
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 71804 38600 279084 0 0 2 1 9 9 0 0 100 0 0
0 0 0 71756 38600 279084 0 0 0 0 8 8 0 0 100 0 0
0 0 0 71756 38600 279084 0 0 0 0 9 9 0 0 100 0 0
^C
[root@oldboye ~]# vmstat 5 6 #<==表示每5秒更新一次輸出信息,統計6次後停止輸出。
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 71804 38600 279084 0 0 2 1 9 9 0 0 100 0 0
0 0 0 71756 38600 279084 0 0 0 0 9 8 0 0 100 0 0
0 0 0 71756 38600 279084 0 0 0 0 8 9 0 0 100 0 0
0 0 0 71756 38600 279084 0 0 0 0 9 8 0 0 100 0 0
0 0 0 71756 38600 279084 0 0 0 0 9 8 0 0 100 0 0
0 0 0 71756 38600 279084 0 0 0 0 9 8 0 0 100 0 0
[root@oldboy ~]#
以下是命令結果說明。
第1列:procs。
q r列表示運行和等待CPU時間片的進程數。
q b列表示在等待資源的進程數。
第2列:memory。
q swpd列表示使用虛擬內存大小。
q free列表示當前空閑的物理內存數量。
q buff列表示buffers 的內存數量。
q cache列表示cache的內存數量。
第3列:swap。
q si(swap in)列表示由磁碟調入內存,也就是內存進入內存交換區的數量。
q so(swap out)列表示由內存調入磁碟,也就是內存交換區進入內存的數量。
第4列:I/O項顯示磁碟讀寫狀況。
q bi列表示從塊設備讀入數據的總量(即讀磁碟)(塊/s)。
q bo列表示寫入到塊設備的數據總量(即寫磁碟)(塊/s)。
第5列:system顯示採集間隔內發生的中斷數。
q in列表示在某一時間間隔中觀測到的每秒設備中斷數。
q cs列表示每秒產生的上下文切換次數。
第6列:CPU項顯示了CPU的使用狀態。
q us列顯示了用戶進程消耗的CPU時間百分比。
q sy列顯示了系統(內核)進程消耗的CPU時間百分比。
q id列顯示了CPU處在空閑狀態的時間百分比。
q wa列顯示了IO等待所佔用的CPU時間百分比。
q st列顯示了虛擬機佔用的CPU時間的百分比。
範例11-13:顯示活躍和非活躍內存。
[root@oldboy ~]# vmstat -a 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
0 0 0 71804 160408 165848 0 0 2 1 9 9 0 0 100 0 0
0 0 0 71756 160408 165844 0 0 0 0 11 11 0 0 100 0 0
0 0 0 71756 160408 165844 0 0 0 0 12 9 0 0 100 0 0
0 0 0 71608 160412 165672 0 0 0 1302 218 341 12 9 80 0 0
0 0 0 71608 160412 165672 0 0 0 0 10 9 0 0 100 0 0
使用-a選項顯示活躍和非活躍內存時,所顯示的內容除增加了inact和active外,其他顯示內容與範例11-12相同。
在Memory列增加的inact和active兩列,說明如下。
q inact: 非活躍內存大小(當使用-a選項時顯示)。
q active: 活躍的內存大小(當使用-a選項時顯示)。
範例11-14:查看內存使用的詳細信息。
[root@oldboy ~]# vmstat -s
486640 total memory
414572 used memory
165656 active memory
160420 inactive memory
72068 free memory
……
這些信息的分別來自於/proc/meminfo,/proc/stat和/proc/vmstat。
範例11-15:查看磁碟的讀/寫。
[root@oldboy ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
ram0 0 0 0 0 0 0 0 0 0 0
ram1 0 0 0 0 0 0 0 0 0 0
……
sr0 0 0 0 0 0 0 0 0 0 0
sda 14667 3623 594388 6737 12864 32806 365372 44250 0 30
這些信息主要來自於/proc/diskstats。其中的merged表示一次來自於合並的寫/讀請求,一般系統會把多個連接/鄰近的讀/寫請求合並到一起來操作。
範例11-16:查看/dev/sda1磁碟的讀寫統計信息。
[root@oldboy ~]# vmstat -p /dev/sda1
sda1 reads read sectors writes requested writes
502 4162 14 68
這些信息主要來自於/proc/diskstats。各列的說明如下。
q reads:來自於這個分區的讀的次數。
q read sectors:來自於這個分區的讀扇區的次數。
q writes:來自於這個分區的寫的次數。
q requested writes:來自於這個分區的寫請求次數。
摘自:
跟老男孩學Linux運維:核心系統命令實戰 第11章 版權歸原作者所有
⑥ 如何控制Linux清理cache機制
Linux下的緩存機制及清理buffer/cache/swap的方法梳理
(1)緩存機制
為了提高文件系統性能,內核利用一部分物理內存分配出緩沖區,用於緩存系統操作和數據文件,當內核收到讀寫的請求時,內核先去緩存區找是否有請求的數據,有就直接返回,如果沒有則通過驅動程序直接操作磁碟。
緩存機制優點:減少系統調用次數,降低CPU上下文切換和磁碟訪問頻率。
CPU上下文切換:CPU給每個進程一定的服務時間,當時間片用完後,內核從正在運行的進程中收回處理器,同時把進程當前運行狀態保存下來,然後載入下一個任務,這個過程叫做上下文切換。實質上就是被終止運行進程與待運行進程的進程切換。
(2)查看緩存區及內存使用情況
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 7866 7725 141 19 74 6897
-/+ buffers/cache: 752 7113
Swap: 16382 32 16350
可以看到內存總共8G,已使用7725M,剩餘141M,不少的人都是這么看的,這樣並不能作為實際的使用率。因為有了緩存機制,具體該怎麼算呢?
空閑內存=free(141)+buffers(74)+cached(6897)
已用內存=total(7866)-空閑內存
由此算出空閑內存是7112M,已用內存754M,這才是真正的使用率,也可參考-/+ buffers/cache這行信息也是內存正確使用率。
(3)可見緩存區分為buffers和cached,他們有什麼區別呢?
內核在保證系統能正常使用物理內存和數據量讀寫情況下來分配緩沖區大小。buffers用來緩存metadata及pages,可以理解為系統緩存,例如,vi打開一個文件。cached是用來給文件做緩存,可以理解為數據塊緩存,例如,dd if=/dev/zero of=/tmp/test count=1 bs=1G 測試寫入一個文件,就會被緩存到緩沖區中,當下一次再執行這個測試命令時,寫入速度會明顯很快。
(4)隨便說下Swap做什麼用的呢?
Swap意思是交換分區,通常我們說的虛擬內存,是從硬碟中劃分出的一個分區。當物理內存不夠用的時候,內核就會釋放緩存區(buffers/cache)里一些長時間不用的程序,然後將這些程序臨時放到Swap中,也就是說如果物理內存和緩存區內存不夠用的時候,才會用到Swap。
swap清理:
swapoff -a && swapon -a
注意:這樣清理有個前提條件,空閑的內存必須比已經使用的swap空間大
(5)怎樣釋放緩存區內存呢?
a)直接改變內核運行參數
#釋放pagecache
echo 1 >/proc/sys/vm/drop_caches
#釋放dentries和inodes
echo 2 >/proc/sys/vm/drop_caches
#釋放pagecache、dentries和inodes
echo 3 >/proc/sys/vm/drop_caches
b)也可以使用sysctl重置內核運行參數
sysctl -w vm.drop_caches=3
注意:這兩個方式都是臨時生效,永久生效需添加sysctl.conf文件中,一般寫成腳本手動清理,建議不要清理。
修改/etc/sysctl.conf 添加如下選項後就不會內存持續增加
vm.dirty_ratio = 1
vm.dirty_background_ratio=1
vm.dirty_writeback_centisecs=2
vm.dirty_expire_centisecs=3
vm.drop_caches=3
vm.swappiness =100
vm.vfs_cache_pressure=163
vm.overcommit_memory=2
vm.lowmem_reserve_ratio=32 32 8
kern.maxvnodes=3
上面的設置比較粗暴,使cache的作用基本無法發揮。需要根據機器的狀況進行適當的調節尋找最佳的折衷。
⑦ linux 查看每個cpu使用率
1.top
使用許可權:所有使用者
使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
說明:即時顯示process的動態
d :改變顯示的更新速度,或是在交談式指令列( interactive command)按s
q :沒有任何延遲的顯示速度,如果使用者是有superuser的許可權,則top將會以最高的優先序執行
c :切換顯示模式,共有兩種模式,一是只顯示執行檔的名稱,另一種是顯示完整的路徑與名稱S :累積模式,會將己完成或消失的子行程( dead child process )的CPU time累積起來
s :安全模式,將交談式指令取消,避免潛在的危機
i :不顯示任何閑置(idle)或無用(zombie)的行程
n :更新的次數,完成後將會退出top
b :批次檔模式,搭配"n"參數一起使用,可以用來將top的結果輸出到檔案內
範例:
顯示更新十次後退出;
top -n 10
使用者將不能利用交談式指令來對行程下命令:
top -s
將更新顯示二次的結果輸入到名稱為top.log的檔案里:
top -n 2 -b < top.log
另附一個命令簡介linux traceroutewindows tracert兩個命令相當,跟蹤網路路由
2.vmstat
正如我們之前討論的任何系統的性能比較都是基於基線的,並且監控CPU的性能就是以上3點,運行隊列、CPU使用率和上下文切換。以下是一些對於CPU很普遍的性能要求:
1.對於每一個CPU來說運行隊列不要超過3,例如,如果是雙核CPU就不要超過6;
2.如果CPU在滿負荷運行,應該符合下列分布,
a) User Time:65%~70%
b) System Time:30%~35%
c) Idle:0%~5%
3. mpstat
對於上下文切換要結合CPU使用率來看,如果CPU使用滿足上述分布,大量的上下文切換也是可以接受的。
常用的監視工具有:vmstat, top,dstat和mpstat.
# vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 104300 16800 95328 72200 0 0 5 26 7 14 4 1 95 0
0 0 104300 16800 95328 72200 0 0 0 24 1021 64 1 1 98 0
0 0 104300 16800 95328 72200 0 0 0 0 1009 59 1 1 98 0
r表示運行隊列的大小,
b表示由於IO等待而block的線程數量,
in表示中斷的數量,
cs表示上下文切換的數量,
us表示用戶CPU時間,
sys表示系統CPU時間,
wa表示由於IO等待而是CPU處於idle狀態的時間,
id表示CPU處於idle狀態的總時間。
dstat可以給出每一個設備產生的中斷數:
# dstat -cip 1
----total-cpu-usage---- ----interrupts--- ---procs---
usr sys idl wai hiq siq| 15 169 185 |run blk new
6 1 91 2 0 0| 12 0 13 | 0 0 0
1 0 99 0 0 0| 0 0 6 | 0 0 0
0 0 100 0 0 0| 18 0 2 | 0 0 0
0 0 100 0 0 0| 0 0 3 | 0 0 0
我們可以看到這里有3個設備號15,169和185.設備名和設備號的關系我們可以參考文件/proc/interrupts,這里185代表網卡eth1.
# cat /proc/interrupts
CPU0
0: 1277238713 IO-APIC-edge timer
6: 5 IO-APIC-edge floppy
7: 0 IO-APIC-edge parport0
8: 1 IO-APIC-edge rtc
9: 1 IO-APIC-level acpi
14: 6011913 IO-APIC-edge ide0
15: 15761438 IO-APIC-edge ide1
169: 26 IO-APIC-level Intel 82801BA-ICH2
185: 16785489 IO-APIC-level eth1
193: 0 IO-APIC-level uhci_hcd:usb1
mpstat可以顯示每個CPU的運行狀況,比如系統有4個CPU。我們可以看到:
# mpstat –P ALL 1
Linux 2.4.21-20.ELsmp (localhost.localdomain) 05/23/2006
05:17:31 PM CPU %user %nice %system %idle intr/s
05:17:32 PM all 0.00 0.00 3.19 96.53 13.27
05:17:32 PM 0 0.00 0.00 0.00 100.00 0.00
05:17:32 PM 1 1.12 0.00 12.73 86.15 13.27
05:17:32 PM 2 0.00 0.00 0.00 100.00 0.00
05:17:32 PM 3 0.00 0.00 0.00 100.00 0.00
總結的說,CPU性能監控包含以下方面:
檢查系統的運行隊列,確保每一個CPU的運行隊列不大於3.
確保CPU使用分布滿足70/30原則(用戶70%,系統30%)。
如果系統時間過長,可能是因為頻繁的調度和改變優先順序。
CPU Bound進程總是會被懲罰(降低優先順序)而IO Bound進程總會被獎勵(提高優先順序)。
4.prstat命令
要顯示系統上當前運行的進程和項目的各種統計信息,請使用帶有-J選項的prstat命令:
%prstat -J
要顯示系統上當前運行的進程和任務的各種統計信息,請使用帶有-T選項的prstat命令:
注–
-J和-T選項不能一起使用。