1.对这个进程中的所有线程作监视:top -p pid -H IT 2.找到最耗cpu的线程:ps -mp pid -o THREAD,tid,time 或者 ps -Lfp pid 3.也可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,cmd,然后再用%cpu字段进行排序。这样就可以找到占用处理器的线程了。 直接使用 ps Hh -eo pid,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 Linux学习,http:// linux.it.net.cn model : 4 model name : Intel(R)Xeon(TM) cpu 3.00GHz stepping : 10 cpu MHz : 3001.177 cache size : 2048 KB IT网,http://www.it.net.cn physical id : 0 IT网,http://www.it.net.cn 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 IT网,http://www.it.net.cn 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 IT网,http://www.it.net.cn bogomips : 6004.52 IT网,http://www.it.net.cn 说明:以下只解释对我们计算cpu使用率有用的相关参数。 参数 解释 processor (0) cpu的一个物理标识 结论1:可以通过该文件根据processor出现的次数统计cpu的逻辑个数(包括多核、超线程)。 /proc/stat文件 该文件包含了所有cpu活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。 实例数据:2.6.24-24版本上的 Linux学习,http:// linux.it.net.cn 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 IT网,http://www.it.net.cn 第一行的数值表示的是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) IT网,http://www.it.net.cn irq (581) 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4) Linux学习,http:// linux.it.net.cn 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文件 该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计 到当前时刻。以下通过实例数据来说明该文件中各字段的含义。 IT网,http://www.it.net.cn [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使用率有用相关参数 参数 解释 IT网,http://www.it.net.cn 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使用率的解释。 Linux学习,http:// linux.it.net.cn #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对应第四列的数据,用第二次的第四列- 第一次的第四列即可 IT网,http://www.it.net.cn idle=第二次的第四列- 第一次的第四列 6、计算cpu使用率 Linux学习,http:// linux.it.net.cn pcpu =100* (total-idle)/total 某一进程cpu使用率的计算 计算方法: 1. 采样两个足够短的时间间隔的cpu快照与进程快照, Linux学习,http:// linux.it.net.cn 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 Linux学习,http:// linux.it.net.cn 3. 计算该进程的cpu使用率pcpu = 100*(processcpuTime2 – processcpuTime1) / (totalcpuTime2 – totalcpuTime1) (按100%计算,如果是多核情况下还需乘以cpu的个数); 实验数据 实验一: 监控一空循环的进程的cpu使用率。 说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。 按以上方法计算得到的cpu使用率 通过top命令得到的 Linux学习,http:// linux.it.net.cn 99.50083 98.333336 98.0 98.83138 IT网,http://www.it.net.cn 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命令刷新屏幕的时间间隔相同。 IT网 按以上方法计算得到的cpu使用率 通过top命令得到的 8.681135 12.0 10.350584 7.6539097 7.6539097 5.0 13.021703 Linux学习,http:// linux.it.net.cn 11.0 8.666667 IT网,http://www.it.net.cn 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快照与线程快照, IT网,http://www.it.net.cn 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的个数); IT网,http://www.it.net.cn 实验数据 实验一: 监控一空循环的线程的cpu使用率。 说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。 按以上方法计算得到的cpu使用率 通过top命令得到的 98.83138 Linux学习,http:// linux.it.net.cn 97.00997 Linux学习,http:// linux.it.net.cn 96.98997 Linux学习,http:// linux.it.net.cn 97.49583 98.169716 96.8386 Linux学习,http:// linux.it.net.cn 97.333336 93.82304 IT网,http://www.it.net.cn 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使用率。 IT网,http://www.it.net.cn 说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。 按以上方法计算得到的cpu使用率 通过top命令得到的 1.3400335 6.644518 1.3333334 Linux学习,http:// linux.it.net.cn 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%计算的. IT网,http://www.it.net.cn 实验一 描述: 在双核的情况下作的一组实验,第一组数据是通过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 L 9140 193 实验二 描述: 在单核的情况下作的一组实验,第一组数据是通过ps -eLo pid,pcpu | grep 6137命令查看进程号为6137的进程中各线程的详细信息。第二组数据是通过 ps命令查看进程号为6137进程的cpu使用率。 数据一: pid lwp %cpu 6137 6137 0.0 6137 6138 0.1 L 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中的定义 IT网,http://www.it.net.cn Linux学习,http:// linux.it.net.cn 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; } IT网,http://www.it.net.cn 没有对传入的参数作任何初步检查,而且设置了永不超时,并且使用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. 找出进程所使用的文件 IT网,http://www.it.net.cn /proc/文件系统保存在内存中,主要保存系统的状态,关键配置等等,而/proc/目录下有很多数字目录,就是进程的相关信息,如下图,我们看看进程10059正在使用哪些文件? 显然,使用了/home/tmp/sess_*文件,这明显是PHP的session文件, 我们查看这个session文件的内容为:view_time|123333312412 到这里,我们已经可以怀疑是由于PHP程序写入一个叫view_time的session项而引起, 那么剩余的事件就是检查包含view_time的所有PHP文件,然后修改之(比如改用COOKIE),这实话, 这个view_time并非敏感数据,仅仅记录用户最后访问时间,实在没必要使用代价巨大的session,而应该使用cookie。 Linux学习,http:// linux.it.net.cn 3. 找出有问题的程序,修改之 Linux学习,http:// linux.it.net.cn 使用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 IT网,http://www.it.net.cn 运行这个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

CentOS下找出占用CPU资源最多的线程的更多相关文章

  1. ios – Xcode警告:“没有处理文件的规则”和“找不到目录”

    重命名我的项目文件夹后,我收到以下错误消息:什么可能出错?解决方法关于第一个警告,您可以在项目设置中的“构建阶段”中检查XCode,即头文件不会出现在“编译源”列表中.

  2. iOS:核心图像和多线程应用程序

    我试图以最有效的方式运行一些核心图像过滤器.试图避免内存警告和崩溃,这是我在渲染大图像时得到的.我正在看Apple的核心图像编程指南.关于多线程,它说:“每个线程必须创建自己的CIFilter对象.否则,你的应用程序可能会出现意外行为.”这是什么意思?我实际上是试图在后台线程上运行我的过滤器,所以我可以在主线程上运行HUD(见下文).这在coreImage的上下文中是否有意义?

  3. ios – 多个NSPersistentStoreCoordinator实例可以连接到同一个底层SQLite持久性存储吗?

    我读过的关于在多个线程上使用CoreData的所有内容都讨论了使用共享单个NSPersistentStoreCoordinator的多个NSManagedobjectContext实例.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用CoreData来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.问题是NSPersistentStoreCoordinator会对基础

  4. ios – XCode断点应该只挂起当前线程

    我需要调试多线程错误.因此,为了获得生成崩溃的条件,我需要在代码中的特定点停止一个线程,并等待另一个线程到达第二个断点.我现在遇到的问题是,如果一个线程遇到断点,则所有其他线程都被挂起.有没有办法只停止一个线程,让其他线程运行,直到它们到达第二个断点?)其他更有趣的选择:当你点击第一个断点时,你可以进入控制台并写入这应该在该断点处暂停当前上下文中的线程一小时.然后在Xcode中恢复执行.

  5. ios – 在后台线程中写入Realm后,主线程看不到更新的数据

    >清除数据库.>进行API调用以获取新数据.>将从API检索到的数据写入后台线程中的数据库中.>从主线程上的数据库中读取数据并渲染UI.在步骤4中,数据应该是最新数据,但我们没有看到任何数据.解决方法具有runloops的线程上的Realm实例,例如主线程,updatetothelatestversionofthedataintheRealmfile,因为通知被发布到其线程的runloop.在后台

  6. 你如何将xcode项目转换为cocoapod?

    我有一段代码,我发现我在多个不同的项目中重复使用,所以我想把它变成一个cocoapod并使用私人cocoapod仓库.我的问题是如何将xcode项目设置为cocoapod?它应该是一个静态库还是一个带有appdelegate的空“项目”?

  7. ios – 如何将文件添加到主包的/ Library / Sounds目录中?

    根据Apple’sdocumentation,/Library/Sounds中的声音文件将在尝试播放声音时由系统搜索.如何将声音文件添加到此文件夹?适用于iOS的正确文档应为here总之,您只需将声音文件作为应用程序包的非本地化资源添加到项目中.

  8. ios – 资产目录与文件夹参考:何时使用其中一个?

    我可以将文件放入Assets.xcassets,或者我可以将文件放入文件夹引用.我何时会选择一个而不是另一个?

  9. ios – 从icloud备份中限制sqlite-wal和sqlite-shm

    我是第一次使用coredata,我必须从文档目录中的iCloud备份限制sqlitedb文件,我使用下面的代码完成了它//阻止iCloud备份文档目录文件夹现在我不明白的是,我们还需要从icloud备份中限制sqlite-wal和sqlite-shm文件,如果是,那么如何从icloud备份限制sqlite-wal和sqlite-shm文件我想要一个解决方案,而无需从文档目录文件夹中更改sqlitedb位置…

  10. ios – NSURLConnectionLoader线程中的奇怪崩溃

    我们开始看到我们的应用启动时发生的崩溃.我无法重现它,它只发生在少数用户身上.例外情况是:异常类型:EXC_BAD_ACCESS代码:KERN_INVALID_ADDRESS位于0x3250974659崩溃发生在名为com.apple.NSURLConnectionLoader的线程中在调用时–[NSBlockOperationmain]这是该线程的堆栈跟踪:非常感谢任何帮助,以了解可能导致这种崩

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部