Linux PM QoS framework(1)_概述和軟件架構

1. 前言

QOS爲Quality Of Service(服務質量)的簡稱,對PM QoS而言,表示Linux kernel電源管理相關的服務質量。那到底什麼是服務質量呢?

我們知道,Linux PM的主要功能,是節省功耗,但同時,會付出一定的性能代價,例如延遲(latency)增加、吞吐量(throughput)下降。可以把PM當作一種服務,把它對性能的影響,類比爲服務的質量(QoS)。對性能的影響越大,QoS越低,反之越高。

不過,PM QoS framework的存在,並不是爲了定義並測量系統的服務質量(Linux系統對實際的qos沒有任何興趣),而是爲了定義一套框架,以滿足系統各個實體(如進程、設備驅動等等)對QoS的期望爲終極目標。根據實際的場景,這些期望可描述爲:xxx不大於某個值;xxx不小於某個值;等等。

這個終極目標,是基於這樣的事實:機器是極端的實用主義者。最理想的狀況,是剛剛滿足系統各個實體對QoS的期望,因而可以在滿足需求的同時,最大化的省電。粗俗一點,就是“我能考60分,爲什麼要多花一點力氣去考61分?”。這樣的思路,值得我們深思。

本文將基於PM QoS framework整體的軟件架構,介紹它的功能、應用場景、使用方式等。

2. 工作原理

kernel將“系統各個實體對QoS的期望”抽象爲一個一個的constraint(可以理解爲約束),圍繞這些constraint,可以將系統的實體分爲三類:requestor、pm qos framework和requestee。示意圖如下:

pm qos

requestors提出對QoS的constraint。常見的requestor包括應用進程、GPU device、net device、flash device等等,它們基於自身的實際特性,需要系統的QoS滿足一定的條件,才能正常工作。

pm qos core負責彙整、整理這些constraint,並根據實際情況,計算出它們的極值(最大或者最小)。

requestee在需要的時候,從pm qos core處獲取constraint的極值,並確保自身的行爲,可以滿足這些constraints。一般情況下,requestee都是電源管理有關的service,包括cpuidleruntime pmpm domain等等。

注:requestor和requestee這兩個詞彙,是蝸蝸自己造出來的,只是爲了理解方便。實際上,Linux kernel使用“QoS dependencies”的概念,分別用“Dependents on a QoS value”和“Watchers of QoS value”表述這兩個實體,具體可參考kernel/power/qos.c和drivers/base/power/qos.c的文件header。

介紹完requestor和requestee之後,還要再回答一個問題:系統中到底有哪些constraint?這決定了request的對象。截至到目前,PM QoS framework將constraint分爲2類,每一類包括若干個constraint,具體如下。

1)系統級的constraint,包括cpu&dma latency、network latency、network throughput和memory bandwidth 4個constraint。

2)設備級別的constraint,包括從低功耗狀態resume的latency、active狀態的latency和一些QoS flag(如是否允許power off)。

蝸蝸會在後續的文章中詳細描述這些constraints的意義,這裏先有個大概的認識即可。

3. 軟件架構

根據上面2類constraint,Linux kernel提供了2個不同的QoS framework:

一個是系統級別的,用於cpu&dma latency、network latency、network throughput、memory bandwidth等場合,稱作PM QoS classes framework。

另一個是device級別的,用於per-device場合,稱作per-device PM QoS framework。

這2個framework有着共同的目標,即:向requestors提供request的add、modify、remove等接口,用於管理QoS requests;將QoS requests分門別類,計算出極值(簡稱value);向requestee提供request value的查詢接口。其軟件架構(非常簡單)如下:

pm qos framework

PM QoS classes framework位於kernel/power/qos.c中,負責系統級別的PM QoS管理。per-device PM QoS framework位於drivers/base/power/qos.c中,負責per-device的PM QoS管理。Common header位於include/linux/pm_qos.h中,負責通用數據結構的抽象、函數聲明等工作。

需要說明的是,PM QoS classes framework會通過misc設備,向用戶空間程序提供PM QoS的request、modify、remove功能,以便照顧到它們對PM QoS的需求。

接下來的文章中,將分別從PM QoS classes framework和per-device PM QoS framework兩個角度描述PM QoS framework,本文就不再詳細描述了。

發佈了35 篇原創文章 · 獲贊 46 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章