天天看點

Linux下如何檢視高CPU占用率線程 LINUX CPU使用率計算

http://www.blogjava.net/fjzag/articles/317773.html

可以用下面的指令将 cpu 占用率高的線程找出來:

ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu

這個指令首先指定參數'H',顯示線程相關的資訊,格式輸出中包含:user,pid,ppid,tid,time,%cpu,cmd,然後再用%cpu字段進行排序。這樣就可以找到占用處理器的線程了。

直接使用 ps Hh -eo pid,tid,pcpu | sort -nk3 |tail 擷取對于的程序号和線程号,然後跳轉到3.

檢視哪個程序線程占用cpu過高; top / ps -aux, 獲得程序号

确定哪個線程占用cpu過高,進入程序号的目錄:/proc/pid/task,

執行:grep SleepAVG  **/status  | sort -k2,2 | head,  确定cpu占用較高的線程号。

使用kill -3 pid 會列印線程堆棧的情況

在 Linux 下 top 工具可以顯示 cpu 的平均使用率(user,nice,system,idle,iowait,irq,softirq,etc.),可以顯示每個 cpu 的使用率。但是無法顯示每個線程的 cpu 使用率情況,這時就可能出現這種情況,總的 cpu 使用率中 user 或 system 很高,但是用程序的 cpu 占用率進行排序時,沒有程序的 user 或 system 與之對應。

proc檔案系統

/proc檔案系統是一個僞檔案系統,它隻存在記憶體當中,而不占用外存空間。它以檔案系統的方式為核心與程序提供通信的接口。使用者和應用程式可以通過/proc得到系統的資訊,并可以改變核心的某些參數。由于系統的資訊,如程序,是動态改變的,是以使用者或應用程式讀取/proc目錄中的檔案時,proc檔案系統是動态從系統核心讀出所需資訊并送出的。

/proc目錄中有一些以數字命名的目錄,它們是程序目錄。系統中目前運作的每一個程序在/proc下都對應一個以程序号為目錄名的目錄/proc/pid,它們是讀取程序資訊的接口。此外,在Linux2.6.0-test6以上的版本中/proc/pid目錄中有一個task目錄,/proc/pid/task目錄中也有一些以該程序所擁有的線程的線程号命名的目錄/proc/pid/task/tid,它們是讀取線程資訊的接口。

/proc/cpuinfo檔案

         該檔案中存放了有關 cpu的相關資訊(型号,緩存大小等)。

[zhengangen@buick ~]$ cat /proc/cpuinfo

processor       : 0

vendor_id       : GenuineIntel

cpu family      : 15

model           : 4

model name      : Intel(R)Xeon(TM) CPU 3.00GHz

stepping        : 10

cpu MHz         : 3001.177

cache size      : 2048 KB

physical id     : 0

siblings        : 2

core id         : 0

cpu cores       : 1

fdiv_bug        : no

hlt_bug         : no

f00f_bug        : no

coma_bug        : no

fpu             : yes

fpu_exception   : yes

cpuid level     : 5

wp              : yes

flags           : fpu vme de psetsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsrsse sse2 ss ht tm pbe lm pni monitor ds_cpl cid xtpr

bogomips        : 6004.52

說明:以下隻解釋對我們計算Cpu使用率有用的相關參數。

         參數                            解釋

processor (0)                       cpu的一個實體辨別

結論1:可以通過該檔案根據processor出現的次數統計cpu的邏輯個數(包括多核、超線程)。

/proc/stat檔案

         該檔案包含了所有CPU活動的資訊,該檔案中的所有值都是從系統啟動開始累計到目前時刻。不同核心版本中該檔案的格式可能不大一緻,以下通過執行個體來說明資料該檔案中各字段的含義。

執行個體資料:2.6.24-24版本上的

fjzag@fjzag-desktop:~$cat /proc/stat

cpu  38082 627 27594 89390812256 581 895 0 0

cpu022880 472 16855 430287 10617 576 661 0 0

cpu115202 154 10739 463620 1639 4 234 0 0

intr120053 222 2686 0 1 1 0 5 0 3 0 0 0 47302 0 0 34194 29775 0 5019 845 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

ctxt1434984

btime1252028243

processes8113

procs_running1

procs_blocked0

第一行的數值表示的是CPU總的使用情況,是以我們隻要用第一行的數字計算就可以了。下表解析第一行各數值的含義:

參數          解析(機關:jiffies)

(jiffies是核心中的一個全局變量,用來記錄自系統啟動一來産生的節拍數,在linux中,一個節拍大緻可了解為作業系統程序排程的最小時間片,不同linux核心可能值有不同,通常在1ms到10ms之間)

user (38082)    從系統啟動開始累計到目前時刻,處于使用者态的運作時間,不包含 nice值為負程序。

nice (627)      從系統啟動開始累計到目前時刻,nice值為負的程序所占用的CPU時間

system (27594)  從系統啟動開始累計到目前時刻,處于核心态的運作時間

idle (893908)   從系統啟動開始累計到目前時刻,除IO等待時間以外的其它等待時間iowait (12256) 從系統啟動開始累計到目前時刻,IO等待時間(since 2.5.41)

irq (581)           從系統啟動開始累計到目前時刻,硬中斷時間(since 2.6.0-test4)

softirq (895)      從系統啟動開始累計到目前時刻,軟中斷時間(since2.6.0-test4)stealstolen(0)                   which is the time spent in otheroperating systems when running in a virtualized environment(since 2.6.11)

guest(0)                               whichis the time spent running a virtual CPU  for  guest operating systems under the control ofthe Linux kernel(since 2.6.24)

結論2:總的cpu時間totalCpuTime = user + nice+ system + idle + iowait + irq + softirq + stealstolen +  guest

/proc/<pid>/stat檔案                                          

該檔案包含了某一程序所有的活動的資訊,該檔案中的所有值都是從系統啟動開始累計

到目前時刻。以下通過執行個體資料來說明該檔案中各字段的含義。

[zhengangen@buick ~]# cat/proc/6873/stat

6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 05882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 00 0 0 17 0 0 0

說明:以下隻解釋對我們計算Cpu使用率有用相關參數

參數                                                               解釋

pid=6873                            程序号

utime=1587                       該任務在使用者态運作的時間,機關為jiffies

stime=41958                      該任務在核心态運作的時間,機關為jiffies

cutime=0                            所有已死線程在使用者态運作的時間,機關為jiffies

cstime=0                            所有已死在核心态運作的時間,機關為jiffies

結論3:程序的總Cpu時間processCpuTime = utime +stime + cutime + cstime,該值包括其所有線程的cpu時間。

/proc/<pid>/task/<tid>/stat檔案

該檔案包含了某一程序所有的活動的資訊,該檔案中的所有值都是從系統啟動開始累計到目前時刻。該檔案的内容格式以及各字段的含義同/proc/<pid>/stat檔案。

         注意,該檔案中的tid字段表示的不再是程序号,而是linux中的輕量級程序(lwp),即我們通常所說的線程。

結論4:線程Cpu時間threadCpuTime = utime +stime

系統中有關程序cpu使用率的常用指令

ps 指令

通過ps指令可以檢視系統中相關程序的Cpu使用率的資訊。以下在linux man文檔中對ps指令輸出中有關cpu使用率的解釋:

CPU usage is currentlyexpressed as the percentage of time spent running during the entire lifetime ofa process. This is not ideal, and it does not conform to the standards that psotherwise conforms to. CPU usage is unlikely to add up to exactly 100%.

%cpu   cpu utilization of the process in"##.#" format. It is the CPU time used                           divided by the timethe process has been running (cputime/realtime ratio),                           expressed as apercentage. It will not add up to 100% unless you are lucky.

結論5:ps指令算出來的cpu使用率相對于程序啟動時的平均值,随着程序運作時間的增大,該值會趨向于平緩。

top指令

通過top指令可以檢視系統中相關程序的實時資訊(cpu使用率等)。以下是man文檔中對top指令輸出中有關程序cpu使用率的解釋。

#C  -- Last used CPU (SMP)                   Anumber representing the last used processor. In a true  SMP environment  this  will likely change  frequently  since the  kernel intentionally usesweak affinity.  Also, the very act ofrunning top may break this weak affinity and cause more processes to  change CPUs  more  often (because of the extra demand for cputime).

%CPU  --  CPUusage                   The  task’s share ofthe elapsed CPU time since the last screen update, expressed as a percent-ageof total CPU time.  In a true SMP environment, if  Irix mode is Off, top will operate in Solaris modewhere a task’s cpu usage will be divided by the total number of CPUs.

結論6:某一個線程在其運作期間其所使用的cpu可能會發生變化。

結論7:在多核的情況下top指令輸出的cpu使用率實質是按cpu個數*100%計算的。

單核情況下Cpu使用率的計算

基本思想

通過讀取/proc/stat 、/proc/<pid>/stat、/proc/<pid>/task/<tid>/stat以及/proc/cpuinfo這幾個檔案擷取總的Cpu時間、程序的Cpu時間、線程的Cpu時間以及Cpu的個數的資訊,然後通過一定的算法進行計算(采樣兩個足夠短的時間間隔的Cpu快照與程序快照來計算程序的Cpu使用率)。

總的Cpu使用率計算

計算方法:

1、  采樣兩個足夠短的時間間隔的Cpu快照,分别記作t1,t2,其中t1、t2的結構均為:

(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元組;

2、  計算總的Cpu時間片totalCpuTime

a)        把第一次的所有cpu使用情況求和,得到s1;

b)        把第二次的所有cpu使用情況求和,得到s2;

c)        s2 - s1得到這個時間間隔内的所有時間片,即totalCpuTime = j2 - j1 ;

3、計算空閑時間idle

idle對應第四列的資料,用第二次的第四列- 第一次的第四列即可

idle=第二次的第四列- 第一次的第四列

6、計算cpu使用率

pcpu =100* (total-idle)/total

某一程序Cpu使用率的計算

計算方法:  

1.              采樣兩個足夠短的時間間隔的cpu快照與程序快照,

a)        每一個cpu快照均為(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元組;

b)        每一個程序快照均為 (utime、stime、cutime、cstime)的4元組;

2.              分别根據結論2、結論3計算出兩個時刻的總的cpu時間與程序的cpu時間,分别記作:totalCpuTime1、totalCpuTime2、processCpuTime1、processCpuTime2

3.              計算該程序的cpu使用率pcpu = 100*(processCpuTime2 – processCpuTime1) / (totalCpuTime2 – totalCpuTime1) (按100%計算,如果是多核情況下還需乘以cpu的個數);

實驗資料

實驗一: 監控一空循環的程序的cpu使用率。
說明:左邊的資料是按以上算法得到的資料,其中采樣的時間間隔與top指令重新整理螢幕的時間間隔相同。
按以上方法計算得到的cpu使用率 通過top指令得到的

99.50083

98.333336

98.0

98.83138

99.0

99.83361

98.83527

98.4975

PID    USER      PR   NI   VIRT   RES   SHR   S  %CPU %MEM  TIME+  COMMAND 

7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:00.74 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:03.71 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:06.67 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:09.63 java              

 7639 fjzag     20   0  206m  10m 7136 S   98  2.2   1:12.59 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:15.55 java              

 7639 fjzag     20   0  206m  10m 7136 S  100  2.2   1:18.55 java              

 7639 fjzag     20   0  206m  10m 7136 S  100  2.2   1:21.54 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:24.52 java              

 7639 fjzag     20   0  206m  10m 7136 S   98  2.2   1:27.46 java

實驗二: 監控jconsole程序的cpu使用率。

8.681135

12.0

10.350584

7.6539097

5.0

13.021703

11.0

8.666667

PID   USER      PR   NI  VIRT   RES   SHR  S  %CPU %MEM  TIME+  COMMAND 

7753 fjzag     20   0  252m  72m  22m S   10 14.4   0:18.70 jconsole          

 7753 fjzag     20   0  252m  72m  22m S   12 14.4   0:19.07 jconsole          

 7753 fjzag     20   0  252m  72m  22m S   11 14.4   0:19.39 jconsole          

 7753 fjzag     20   0  252m  72m  22m S    7 14.4   0:19.61 jconsole          

 7753 fjzag     20   0  252m  72m  22m S    7 14.4   0:19.83 jconsole          

 7753 fjzag     20   0  252m  72m  22m S    5 14.4   0:19.97 jconsole          

 7753 fjzag     20   0  252m  72m  22m S   14 14.4   0:20.38 jconsole          

 7753 fjzag     20   0  252m  72m  22m S   10 14.4   0:20.68 jconsole          

 7753 fjzag     20   0  252m  72m  22m S    9 14.5   0:20.96 jconsole

某一線程Cpu使用率的計算

1.              采樣兩個足夠短的時間隔的cpu快照與線程快照,

a)        每一個cpu快照均為(user、nice、system、idle、iowait、irq、softirq、stealstealon、guest)的9元組;

b)        每一個線程快照均為 (utime、stime)的2元組;

2.              分别根據結論2、結論4計算出兩個時刻的總的cpu時間與線程的cpu時間,分别記作:totalCpuTime1、totalCpuTime2、threadCpuTime1、threadCpuTime2

3.              計算該線程的cpu使用率pcpu = 100*( threadCpuTime2– threadCpuTime1) / (totalCpuTime2– totalCpuTime1) (按100%計算,如果是多核情況下還需乘以cpu的個數);

實驗一: 監控一空循環的線程的cpu使用率。

97.00997

96.98997

97.49583

98.169716

96.8386

97.333336

93.82304

98.66667

7649 fjzag     20   0  206m  10m 7136 R   97  2.2   7:22.94 java              

 7649 fjzag     20   0  206m  10m 7136 R   97  2.2   7:25.86 java              

 7649 fjzag     20   0  206m  10m 7136 R   97  2.2   7:28.76 java              

 7649 fjzag     20   0  206m  10m 7136 R   99  2.2   7:31.72 java              

 7649 fjzag     20   0  206m  10m 7136 R   98  2.2   7:34.65 java              

 7649 fjzag     20   0  206m  10m 7136 R   96  2.2   7:37.53 java              

 7649 fjzag     20   0  206m  10m 7136 R   98  2.2   7:40.47 java              

 7649 fjzag     20   0  206m  10m 7136 R   96  2.2   7:43.34 java              

 7649 fjzag     20   0  206m  10m 7136 R   97  2.2   7:46.25 java

實驗二: 監控jconsole程式某一線程的cpu使用率。

1.3400335

6.644518

1.3333334

0.6677796

0.6666667

 PID    USER      PR   NI   VIRT   RES  SHR  S  %CPU %MEM  TIME+  COMMAND 

7755 fjzag     20   0  251m  72m  22m S    1 14.4   0:11.92 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    7 14.4   0:12.12 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    2 14.4   0:12.18 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    0 14.4   0:12.18 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    1 14.4   0:12.20 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    1 14.4   0:12.24 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    1 14.4   0:12.28 jconsole

多核情況下cpu使用率的計算                                                    

以下通過實驗資料來說明多核情況下某一程序cpu使用率是按cpu個數*100%計算的.

實驗一

描述:

在雙核的情況下作的一組實驗,第一組資料是通過ps  -eLo pid,lwp,pcpu | grep 9140指令檢視程序号為9140的程序中各線程的詳細資訊。第二組資料是通過 ps指令檢視程序号為9140程序的cpu使用率。

資料一:

pid   lwp  %cpu

9140  9140  0.0

 9140  9141  0.0

 9140  9142  0.0

 9140  9143  0.0

 9140  9144  0.0

 9140  9149  0.0

 9140  9150  0.0

 9140  9151  0.0

 9140  9152  0.1

 9140  9153 96.6                         該線程是一個空循環

 9140  9154 95.9                         該線程是一個空循環

以上除了紅色标注出來的兩個線程以外,其他的線程都是背景線程。

資料二:

pid   %cpu

9140  193

實驗二

描述:

在單核的情況下作的一組實驗,第一組資料是通過ps  -eLo pid,lwp,pcpu | grep 6137指令檢視程序号為6137的程序中各線程的詳細資訊。第二組資料是通過 ps指令檢視程序号為6137程序的cpu使用率。

 pid    lwp  %cpu

 6137 6137  0.0

 6137 6138  0.1

 6137 6143  0.0

 6137 6144  0.0

 6137 6145  0.0

 6137 6146  0.0

 6137 6147  0.0

 6137 6148  0.0

 6137 6149  0.0

 6137 6150 46.9                                                 空循環線程

 6137 6151 46.9                                                 空循環線程

資料二

pid %cpu

6137 92.9

主要問題:

1.      不同核心版本/proc/stat檔案格式不大一緻。/proc/stat檔案中第一行為總的cpu使用情況。

各個版本都有的4個字段: user、nice、system、idle

2.5.41版本新增字段:iowait

2.6.0-test4新增字段:irq、softirq

2.6.11新增字段:stealstolen:                    which is thetime spent in other operating

systems whenrunning in a virtualized environment

2.6.24新增字段:guest:                                    whichis the time spent running a virtual CPU  for  guest operating systems under the control ofthe Linux kernel

2./proc/pid/task目錄是Linux 2.6.0-test6之後才有的功能。

3.關于出現cpu使用率為負的情況,目前想到的解決方案是如果出現負值,連續采樣計算cpu使用率直到為非負。

4.有些線程生命周期較短,可能在我們采樣期間就已經死掉了.

php-cgi程序占用cpu資源過多負載高的原因分析及解決步驟

伺服器環境:redhat linux 5.5 , nginx ,  phpfastcgi

在此環境下,一般php-cgi運作是非常穩定的,但也遇到過php-cgi占用太多cpu資源而導緻伺服器響應過慢,我所遇到的php-cgi程序占用cpu資源過多的原因有:

1. 一些php的擴充與php版本相容存在問題,實踐證明 eAccelerater與某些php版本相容存在問題,具體表現時啟動php-cgi程序後,運作10多分鐘,奇慢無比,但靜态資源通路很快,伺服器負載也很正常(說明nginx沒有問題,而是php-cgi程序的問題),解決辦法就是從php.ini中禁止掉eAccelerater子產品,再重新開機php-cgi程序即可

2. 程式中可能存在死循環,導緻伺服器負載超高(使用top指令檢視負載高達100+), 需要借助Linux的proc虛拟檔案系統找到具體的問題程式

3. php程式不合理使用session , 這個發生在開源微網誌記事狗程式上,具體表現是有少量php-cgi程序(不超過10個)的cpu使用率達98%以上, 伺服器負載在4-8之間,這個問題的解決,仍然需要借助Linux的proc檔案系統找出原因。

4. 程式中存在過度耗時且不可能完成的操作(還是程式的問題),例如discuz x 1.5的附件下載下傳功能: source/module/forum/forum_attachement.php中的定義

function getremotefile($file) {

    global $_G;

    @set_time_limit(0);

    if(!@readfile($_G['setting']['ftp']['attachurl'].'forum/'.$file)) {

        $ftp = ftpcmd('object');

        $tmpfile = @tempnam($_G['setting']['attachdir'], '');

        if($ftp->ftp_get($tmpfile, 'forum/'.$file, FTP_BINARY)) {

            @readfile($tmpfile);

            @unlink($tmpfile);

        } else {

            return FALSE;

        }

    }

    return TRUE;

}

沒有對傳入的參數作任何初步檢查,而且設定了永不逾時,并且使用readfile一次讀取超大檔案,就可能存在以下問題:

 A. 以http方式讀取遠端附件過度耗時

 B. FTP無法連接配接時,如何及時回報出錯誤?

 C. readfile是一次性讀取檔案加載到記憶體中并輸出,當檔案過大時,記憶體消耗驚人

      根據實驗發現采用readfile一次性讀取,記憶體消耗會明顯增加,但是CPU的使用率會下降較多。如果采用分段讀取的方式,記憶體消耗會稍微下降,而CPU占用卻會明顯上升。

對discuz x 1.5的這個bug較好解決方法就是背景重新正确設定遠端附件參數。

以下是我逐漸整理的故障排除步驟:

1. 得到占用cpu資源過多的php-cgi程序的pid(程序id), 使用top指令即可,如下圖:

經過上圖,我們發現,有兩個php-cgi程序的cpu資源占用率過高,pid分别是10059,11570,這一般都是程式優化不夠造成,如何定位問題的php程式位置?

2. 找出程序所使用的檔案

/proc/檔案系統儲存在記憶體中,主要儲存系統的狀态,關鍵配置等等,而/proc/目錄下有很多數字目錄,就是程序的相關資訊,如下圖,我們看看程序10059正在使用哪些檔案?

顯然,使用了/home/tmp/sess_*檔案,這明顯是PHP的session檔案, 我們檢視這個session檔案的内容為:view_time|123333312412

到這裡,我們已經可以懷疑是由于php程式寫入一個叫view_time的session項而引起, 那麼剩餘的事件就是檢查包含view_time的所有php檔案,然後修改之(比如改用COOKIE),這實話, 這個view_time并非敏感資料,僅僅記錄使用者最後通路時間,實在沒必要使用代價巨大的session, 而應該使用cookie。

3. 找出有問題的程式,修改之

使用vi編輯以下shell程式(假設網站程式位于/www目錄下)

 #!/bin/bash

 find /www/ -name "*.php" > list.txt

f=`cat ./list.txt`

for n in $f

do 

    r=`egrep 'view_time' $n`

    if [ ! "$r" = "" ] ; then

        echo $n

     fi 

done

運作這個shell程式,将輸出包含有view_time的檔案, 對記事狗微網誌系統,産生的問題位于modules/topic.mod.class檔案中

http://blog.csdn.net/turkeyzhou/article/details/6709953

http://www.cnblogs.com/cute/archive/2011/04/20/2022280.html

最近對我的本本(4核8線程)用top指令看系統狀況出現了CPU使用率超過200%的情況,非常詫異,查了下相關資料,把這個問題弄清楚了。

首先來分析下CPU Load

load average: 0.09, 0.05, 0.01

分别是1分鐘、5分鐘、15分鐘的平均Load。

Load這個東西怎麼了解呢,就像一條馬路,有N個車道,如果N個程序進入車道,那麼正好一人一個,再多一輛車就占不到車道,要等有一個車空出車道。

在CPU中可以了解為CPU可以并行處理的任務數,那麼就是“CPU個數 * 核數”,如果CPU Load = CPU個數 * 核數 那麼就是說CPU正好滿負載,再多一點,可能就要出問題了,有任務不能被及時配置設定處理器,那麼保證性能的話,最好是小于CPU個數 * 核數 *0.7。

檢視CPU核數可以通過:grep ‘model name’ /proc/cpuinfo

那麼以哪個平均值為準呢?如果1分鐘平均出現大于CPU個數 * 核數的情況,還不用擔心,如果5分鐘平均也是,那就要警惕了,15分鐘平均也是這樣,就要分析哪裡出問題了,防範于未然

CPU使用率超過100%的問題,也是差不多,top指令應該是把每個核的CPU占用率加起來,算一個和,于是多核情況下會出現超過100%。

另外Context Switch Rate也是個非常值得注意的值,因為線程間切換的代價也是非常高的。

引用一個公式:Context Switch Rate = Interrupt Rate + TPS* N

對于一個多線程的程式,我覺得準備一個控制線程來排程任務是非常必要的,免得線程過于高并發,導緻資源的争用和線程切換帶來性能問題,最好控制并發的線程數基本等于CPU的總核數,減少這個N,獲得更好的處理器性能。

Java 系統性能分析 指令 

ps