我想在我的linux機器上的C++線程中定期調用一個採樣函數。我想在非常短的時間內(最好是1毫秒)重新啓動我的功能,但我發現在1毫秒時間內消耗的功率(以瓦特爲單位)非常高:系統運行功率水平是雙倍週期是5毫秒。保持低功耗是我想要的功能的主要關注點。細粒度nanosleep在linux上的C++程序中不能省電
具體地說,
void* loop_and_sample(void* arg) {
while(1) {
sample();
nanosleep((struct timespec[]){{0,1000000}}, NULL);
}
}
注意到2X的功率:
void* loop_and_sample(void* arg) {
while(1) {
sample();
nanosleep((struct timespec[]){{0,5000000}}, NULL);
}
}
我已確定,在第2個頻率在我的採樣的功率使用的差值是可忽略的,並且,額外的功率消費來自睡眠呼叫。也就是說,即使我在上面的兩個片段中註釋了sample()行,第二個仍然佔用了一半的權力。有關我如何能夠減少睡眠呼叫消耗的功率的任何想法?
通知你,我在24核Intel Xeon和搜索頻率我的/ boot/config中的運行Ubuntu 3.2.0顯示以下內容:
cat /boot/config-3.2.0-48-generic | egrep 'HZ'
CONFIG_RCU_FAST_NO_HZ=y
CONFIG_NO_HZ=y
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_MACHZ_WDT=m
然而,運行此腳本:http://www.advenage.com/topics/linux-timer-interrupt-frequency.php ,我發現我的內核定時器中斷至少爲4016 Hz(這是我想要採樣的頻率的4倍)。謝謝你的幫助!
請指定您的硬件以及您正在運行的內核版本。電源狀態管理是深沉的巫術,並且高度依賴於硬件。 –
Mark B(下面)可能是正確的,所以這是一個很長的一步,但是...你可以嘗試使用timerfd(見http://linux.die.net/man/2/timerfd_create),以防這是一個內部實施小睡眠睡眠的問題。 – Nemo
Ubuntu 3.2.0(如上所述)和Intel Xeon 24核心機器(現在添加到主體中) – jst14