果真是系统开启了tuned服务,然后拉起了名字为tuned的线程.
查看一下tuned服务的配置文件:
- localhost:/home/jeff # tuned-adm active
- Current active profile: sap-hana
- localhost:/home/jeff # cat /usr/lib/tuned/sap-hana/tuned.conf
- [main]
- summary=Optimize for SAP NetWeaver, SAP HANA and HANA based products
- [cpu]
- force_latency = 70
发现关于cpu这一项,设置强制延迟时间为70秒 force_latency = 70 ,这个是为了优化HANA数据库。
到底force_latency怎样起作用,经过一顿搜索,发现这个值是被设置进了/dev/cpu_dma_latency
使用lsof /dev/cpu_dma_latency, 发现tuned线程确实是在操作这个文件
- #lsof /dev/cpu_dma_latency
- COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- tuned 18734 root 9w CHR 10,60 0t0 11400 /dev/cpu_dma_latency
而且Linux内核文档也说明了/dev/cpu_dma_latency文件,如果要对它进行写操作,要open之后写数据之后不close,如果释放掉了文件描述符它就又会恢复到默认值,这也印证了上面lsof /dev/cpu_dma_latency是有输出结果的.
- https://github.com/torvalds/linux/blob/v5.8/Documentation/trace/coresight/coresight-cpu-debug.rst
- As specified in the PM QoS documentation the requested parameter
- will stay in effect until the file descriptor is released. For example:
- # exec 3<> /dev/cpu_dma_latency; echo 0 >&3
- …
- Do some work…
- …
- # exec 3<>-
查看一下/dev/cpu_dma_latency文件的内容,确实是70,也就是(force_latency = 70)
- localhost:/home/jeff # cat /dev/cpu_dma_latency | hexdump -Cv
- 00000000 46 00 00 00 |F…|
- localhost:/home/jeff # echo $((0x46))
- 70
此时查看一下系统中cpu各个睡眠态的描述和延迟时间值:
- # cd /sys/devices/system/cpu/cpu0/cpuidle/
- # for state in * ; do
- echo -e \
- "STATE: $state\t\
- DESC: $(cat $state/desc)\t\
- NAME: $(cat $state/name)\t\
- LATENCY: $(cat $state/latency)\t\
- RESIDENCY: $(cat $state/residency)"
- done
发现C3态的延迟时间是33微秒,C4的延时时间是133微秒,所以(force_latency = 70) ,
系统就只能睡眠到C3了 .(延迟时间就是从此睡眠态唤醒到运行态的时间)
- STATE: state0 DESC: CPUIDLE CORE POLL IDLE NAME: POLL LATENCY: 0 RESIDENCY: 0
- STATE: state1 DESC: MWAIT 0x00 NAME: C1 LATENCY: 2 RESIDENCY: 2
- STATE: state2 DESC: MWAIT 0x01 NAME: C1E LATENCY: 10 RESIDENCY: 20
- STATE: state3 DESC: MWAIT 0x10 NAME: C3 LATENCY: 33 RESIDENCY: 100
- STATE: state4 DESC: MWAIT 0x20 NAME: C6 LATENCY: 133 RESIDENCY: 400
- STATE: state5 DESC: MWAIT 0x32 NAME: C7s LATENCY: 166 RESIDENCY: 500
此时关闭tuned 服务, 再查看一下 /dev/cpu_dma_latency的值,变成了默认的2000秒