精华内容
下载资源
问答
  • 可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%...

    可以用下面的命令将 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//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//task//stat文件

    该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。该文件的内容格式以及各字段的含义同/proc//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//stat、/proc//task//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.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使用率。

    说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。

    按以上方法计算得到的cpu使用率

    通过top命令得到的

     

    8.681135

    12.0

    10.350584

    7.6539097

    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使用率。

    说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。

    按以上方法计算得到的cpu使用率

    通过top命令得到的

     

    98.83138

    97.00997

    96.98997

    97.49583

    98.169716

    96.8386

    97.333336

    93.82304

    98.66667

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

    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使用率。

    说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。

    按以上方法计算得到的cpu使用率

    通过top命令得到的

     

    1.3400335

    6.644518

    1.3333334

    0.6677796

    0.6666667

    1.3333334

    1.3333334

     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 {
                @unlink($tmpfile);
                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 系统性能分析 命令 

    1. cpu分析
         top , pidstat(sysstat)
         pid -p PID -t 1 10
         vmstat 1   CPU上下文切换、运行队列、利用率
         ps Hh -eo tid
         pcpu 查看具体线程的CPU消耗
         sar   来查看一定世界范围内以及历史的cpu消耗情况信息

         查看java线程信息
         jstack pid | grep 'nid=0x9999'

       
    2. cs sy消耗比较高
         上下文切换性能偏高, jstack -l pid, 查看on object monitor

    3. io消耗
         pidstat -d -t -p pid 1 100
         iostat

    4. 网络io消耗
         cat /proc/interruptes
         sar -n FULL 1 2
         tcpdump
    展开全文
  • 作为 Linux 运维工程师,在日常工作中我们会遇到 Linux服务器上出现CPU负载达到100%居高不下的情况,如果CPU 持续跑高,则会影响业务系统的正常运行,带来企业损失。 很多运维的同学遇到这种状况往往会不知所措,...
  • 查看linux线程CPU占用率

    千次阅读 2017-11-23 01:47:40
    下面是分析这个进程里面的线程CPU占用率. 方法1: $ ps -C test -L -o pid,tid,psr,pcpu,comm PID TID PSR %CPU COMMAND 22849 22849 3 0.0 test 22849 22850 1 99.9 child_thread 方法2: 以 top -H 执行...

    测试代码如下:

    #include <sys/prctl.h>
    #include <pthread.h>
    
    void *thread_routine(void *arg)
    {
    	prctl(PR_SET_NAME, "child_thread");
    	int i = 0;
    	while(1)
    	{
    		i++;
    		i = i * 12345;
    	}
    	return (void *)0;
    }
    
    int main( void )
    {
    	pthread_t handle;
    	pthread_create(&handle, NULL, thread_routine, NULL);
    	pthread_join(handle, NULL);
    	return 0;
    }

    编译成可执行文件  test.

    然后,执行 test.

    下面是分析这个进程里面的线程的CPU占用率.

    方法1:

    $ ps -C test -L -o pid,tid,psr,pcpu,comm
      PID   TID PSR %CPU COMMAND
    22849 22849   3  0.0 test
    22849 22850   1 99.9 child_thread
    方法2:

    以 top -H 执行,然后,按 f键, 按空格键 选中

    P       = Last Used Cpu (SMP)

    ,按Esc后者 q退出,输出结果如下:

    Threads: 742 total,   3 running, 738 sleeping,   0 stopped,   1 zombie
    %Cpu(s): 40.6 us,  2.5 sy,  0.1 ni, 56.5 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  4086928 total,   670704 free,  1989828 used,  1426396 buff/cache
    KiB Swap:  4140028 total,  3609488 free,   530540 used.  1507048 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                      P 
    22850 charles   20   0   10512    592    532 R 99.9  0.0  22:01.90 child_thread                 3 
    28277 charles   20   0 1601204 457328 138820 R 36.8 11.2 214:36.88 Compositor                   1 
     1191 root      20   0  347380 106852  67784 S 11.1  2.6 955:34.67 Xorg                         0 
     2069 charles   20   0  422700 120328  37048 S  9.4  2.9 595:07.34 compiz                       0

    或者:

    $ pidof test
    22849
    $ top -H -p 22849
    KiB Mem :  4086928 total,   335404 free,  2245788 used,  1505736 buff/cache
    KiB Swap:  4140028 total,  3613268 free,   526760 used.  1263944 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND      
    22850 charles   20   0   10512    592    532 R 99.9  0.0 118:54.15 child_thread 
    22849 charles   20   0   10512    592    532 S  0.0  0.0   0:00.00 test 


    展开全文
  • 可以查看线程cpu占用率的工具

    热门讨论 2010-04-21 18:08:57
    用在嵌入式linux平台上,通常busybox的top无法看到多线程应用的每个线程cpu占用率,特地编写了这个小工具.
  • linux 查看每个线程cpu占用率

    千次阅读 2018-12-04 16:34:05
    ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段...这样就可以找到占用处理器的线程了。...

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

    这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段进行排序。这样就可以找到占用处理器的线程了。

    展开全文
  • Linux 线程CPU占用率过高定位分析

    千次阅读 2020-07-21 23:01:55
    下边说下Linux调试过程中CPU占用率过高的情况怎么调试 CPU占用过高,模拟CPU占用过高的情况 先上一段代码: #include <iostream> #include <thread> #include <vector> int main(int argc, ...

    在Linux开发中经常会与多线程打交道,所以多线程开发与调试就很重要

    下边说下Linux调试过程中CPU占用率过高的情况怎么调试

    CPU占用过高,模拟CPU占用过高的情况

    先上一段代码:

    #include <iostream>
    #include <thread>
    #include <vector>
    
    int main(int argc, char **argv) {
    
        std::vector<std::thread> test_threads;
        for(int i = 0; i < 9; i++){
          test_threads.push_back(std::thread([]{
        while(1){
          std::this_thread::sleep_for(std::chrono::milliseconds(500));
        }
          }));
        }
        test_threads.push_back(std::thread([]{
          while(1){
          std::cout<<"cpu"<<std::endl;
          }
        }));
    
        for(auto &x : test_threads){
          x.join();
        }
    
        return 0;
    }

    用下边的命令编译( linux标准库没有pthread.h 要链接之-lpthread):

    g++ -o allen_test allen_test.cpp -lpthread

    执行可执行文件:

    ./allen_test

    由代码可知࿰

    展开全文
  • 前言: 在前嵌入式开发中,往往需要考虑占用内存大小以及CPU占用率。所以我们在写好程序后,就需要进行测试,防止出现CPU使用率过高以及内存占用过大,导致程序不能运行的问题,下面就介绍一种简单通用的办法来实现...
  • 1.简介  一个程序,完成它预设的功能,并不能说明它是一个优良的程序。好的程序,应该是对资源的合理利用,亦或是 ...本文着重讲解一下在linux系统下,如何查看CPU占用率的进程,线程。   2.python代码  为了
  • linux查看线程cpu占用情况

    千次阅读 2015-10-31 14:37:31
    在搞服务器的时候有时候会遇到一些线程CPU占用100%的情况,这里记录一些查看方法以备不时之需。具体操作请看: 1、 ps -aef | grep TestTcpSV rickey 2932 1864 0 17:00 pts/0 00:00:00 ./TestTcpSV rickey 2999 ...
  • 获取当前所有进程线程Cpu占用率.rar

    热门讨论 2009-01-12 23:25:22
    可以选择一个进程,查询里面各线程cpu占用率。 主要方法是通过 System.Diagnostics.Process类的 TotalProcessorTime.TotalMilliseconds属性 获取两次统计间隔的cpu时间,除以间隔时间。得到占用率 用途:查看自己写...
  • https://yq.aliyun.com/articles/270229
  • 有时候要进行压力測试,那么怎样来看呢,一般我们会通过top命令查看各个进程的cpu和内存占用情况,获得到了我们的进程id,然后我们或许会通过pstack命令查看里边的各个线程id以及相应的线程如今正在做什么事情,分析...
  • 在开发中,我们不免会遇到某个程序占用CPU很高的情况,我们可能可以用top命令查看到是该进程的某个线程CPU占有高的很,通过top命令后,再按h键便可查看对应的线程号,如下图示: 按下h键后: 现在知道了那个...
  • Linux下如何查看CPU占用率线程

    千次阅读 2012-10-30 19:54:59
    Linux 下 top 工具可以显示 cpu 的平均利用率(user,nice,system,idle,iowait,...这时就可能出现这种情况,总的 cpu 利用率中 user 或 system 很高,但是用进程的 cpu 占用率进行排序时,没有进程的 user 或 system
  • 1、我们使用top命令查找java命令下cpu占用最高的进程: 例如pid为9595的进程是占用cpu使用最大的。 2、使用 top -H -p 9595 查看当前pid为9595进程下各线程占用cpu情况 我们现在看到,pid为10034的线程占用...
  • Linux下解决CPU占用率100%问题的步骤

    千次阅读 2020-08-10 16:07:17
    查看进程中cpu占用率高的线程ID - TID3. 将线程ID - TID 转换成16进制 - XTID4. 将进程中的所有线程输出到文件5. 在输出文件中查找对应的线程ID 我们经常会解决一些cpu占用率100%的问题,有些问题可能比较容易分析...
  • Linux查看CPU、内存占用率 我们经常需要查看 CPU和内存占用率,否则一旦存在情况很快就会有IDC(或客户)找上门,Linux查看资源使用情况有多种命令可以参考,CPU、内存、IO、NETWORK等资源使用情况都可以通过...
  • Linux下如何查看CPU占用率线程 LINUX CPU利用率计算转 http://www.cnblogs.com/lidabo/p/4738113.html目录(?)[-]proc文件系统proccpuinfo文件procstat文件procpidstat文件 procpidtasktidstat文件系统中有关进.....
  • -------------------------------- top uptime 查看进程ID jps -l ps -ef|grep java|grep -v grep 查看具体线程 ps -mp 22425 -o THREAD,tid,time 找出占用cpu最高的线程 根据tid(线程ID) 线程ID 转化为16进制 ...
  • ②使用top -p 14292 -H观察该进程中所有线程CPU占用。 如图所示 ③找出CPU消耗较多的线程id,如1602,将1602转换为16进制642 ④使用jstack 14292|grep -A 10 0x3de4来查询出具体的线程状态 [root@cp01-game-dudai...
  • 嵌入式linux线程CPU占用跟踪

    千次阅读 2017-08-25 18:00:38
    1.linux系统CPU占用率高,首先需要查看那些进程cpu占用率高,这个通过top 命令,可以查看, 可见,我这里是n1l.bin 占用了几乎100% CPU,并且可看到进程id = 15262.进一步分析n1l.bin 里那些线程cpu占有率高
  • 在过度调用GC或及CPU占用率过高的时候,这种排错技术是至关重要的。假设你没有使用像是Compuware dynaTrace或者JVisualVMware这样先进的监视工具。有关于这些工具的使用教程将会在以后发布,但是请先确保自己掌握...
  • LinuxCPU占用率高分析方法

    千次阅读 2018-07-31 10:41:17
    一、可能有线程一直占用CPU资源 1. 先通过 ps 查看进程状态,找出进程的PID(8209)。 2.jstack -l 8209 &gt; /usr/local/work/...4. 通过top -H -p 8209 命令查看对应进程是哪个线程占用CPU过高(eg:8308...
  • Linux CPU占用率过高时问题排查

    万次阅读 2019-04-11 12:13:46
    1.查看CPU占用率高的进程 1.1> top 1.2> 用ps -eo pid,pcpu | sort -n -k 2 2.确定高cpu消耗的线程 2.1>top -H 2.2>ps H -eo pid,tid,pcpu | sort -n -k 3 3.查看进程的线程 3.1>pstree -p ...
  • 第 第 PAGE 1 页 共 NUMPAGES 1 页 Linux top命令查看多核CPU每个核心的使用 CPU是电脑的重要组成部分是不可缺少的角色下面是小编带来的关于Linux top命令查看多核CPU每个核心的使用的内容欢迎阅读! Linux top...
  • 此时获取了cpu使用最高的线程数的pid=23225,由于linux线程进制是十进制,而java里面线程进制是16进制的的,所以需要把10进制的pid转化成16进制 printf "%x\n" 'pid' 最后使用jstack命令来获取nid为5ab9...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,882
精华内容 12,352
关键字:

linux查看线程cpu占用率

linux 订阅