问题:在充分利用CPU的前提下,当一个后台应用的CPU使用率已经在100%了,这个服务还可以从什么角度进行性能优化!解释:
如何提高CPU的利用率:
- 基本思路是如何让CPU的超线程或者多核更加均衡和高效的利用起来,我们知道总是有一块cpu去专门响应网卡的中断请求,如果网络请求包非常大,很可能单个CPU就处理不过来,因此,需要激活多核或者超线程,把网卡中断请求分发到多个CPU去执行,从而提高整体服务器的接入性能,也是提高CPU资源利用率的好办法。
服务还可以从什么角度进行性能优化!
1.限制CPU使用率
1.限制CPU使用率:cpulimit工具
cpulimit --help查看官方帮助信息
cpulimit -l 70 -v -p 6258 #指限制CPU使用率为70%,显示控制统计,显示PID过程
该方法有可能会影响程序性能不建议使用。
2.增加系统cache,提高缓存容量。
性能测试工具
受限需要了解CPU调度的含义以及具体原理
操作系统采用时间片轮转调度算法分配的时间片给每个进程中的线程
实际上,CPU不可能得到100%的利用,肯定有浪费的,而开启多线程,就能够更充分地利用这些可能要浪费的时间片
接下来在Linux下查看CPU使用配置参数
在boot/config下查看内核参数配置值: grep ‘CONFIG_HZ=’ /boot/config-$(uname -r)查看系统定义的节拍器。
使用Linux系统查看CPU使用情况
$ perf top
Samples: 833 of event 'cpu-clock', Event count (approx.): 97742399
Overhead Shared Object Symbol
7.28% perf [.] 0x00000000001f78a4
4.72% [kernel] [k] vsnprintf
4.32% [kernel] [k] module_get_kallsym
3.65% [kernel] [k] _raw_spin_unlock_irqrestore
...
第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量
再往下看是一个表格式样的数据,每一行包含四列,分别是: 第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared
Object),如内核、进程名、动态链接库名、内核模块名等。 第三列 Object ,是动态共享对象的类型。比如 [.]
表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
最后一列 Symbol是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
也就是说当可以使用十六进制对应出函数名时就知道了该程序在函数为什么频繁调用从程序层面优化程序。
perf record 采样后保存到文件 和 perf report 解析展示
如下:
$ perf record # 按Ctrl+C终止采样
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.452 MB perf.data (6093 samples) ]
$ perf report # 展示类似于perf top的报告
性能优化CPU Cache理解与性能优化
拓展—CPU使用率较低但负载较高
问题描述 当前Linux系统没有业务程序运行。通过top命令观察,发现CPU很空闲,但是load average(表示的是CPU的平均负载)却非常高,如下图所示。这里的 load average 的三个值分别指系统在最后 1/5/15分钟 的平均负载值。
处理办法
load average是对CPU负载进行评估的,其值越高说明其任务队列越长,处于等待执行的任务越多。出现此种情况时,可能是由于僵死进程导致的。可以通过ps
-axjf命令查看是否存在 D+ 状态进程,该状态是指不可中断的睡眠状态。处于该状态的进程无法终止,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。
----------------------------还需要继续涉猎总结----------------------------