執行人: JeffBla
解說影片
回顧並行和多執行緒程式設計教材,探究 Linux 核心的同步處理機制,理解其原理、重新實作,並量化分析。
研讀以下材料、紀錄問題和提出對應教材的改進
搭配 union 在組合語言的地方(第 13 行)雖然只有改 slock 的話 owner 會被更新 lockval(0) + (1 << TICKET_SHIFT)(4)。
然而 next 的值卻不被改變,因為原先 lockval 就是來自 slock 也就是 [next|owner] 。而現在雖然只改變 lockval 但因為等待 lock 的數量不會多到這個情況,所以會變動到的只有 owner。
被更新的是 next
修改後的敘述
在這段組合語言中(第 13 行左右),透過 lockval + (1 << TICKET_SHIFT) 的操作,我們對 slock(32-bit 的 union 值)加上一個常數,這個常數剛好只會改變 next(高 16 bits),而不會改動 owner(低 16 bits)。因為 lockval 原本是從 slock 複製出來的,也就是 lockval = [next | owner],加上 (1 << 16) 僅僅是把 next
在超過三個 cpu 使用時(owner and successors)會退化成 MCS lock
Q: where is the node->count used?
inet_unhash 解法為避免在別的處理器執行,其中的舉例為
避免這種情況的發生,例如藉由外部的機制或者工具,對行程和處理器進行綁定,從而避免行程在多個處理器間來回。
另一種可行方法:利用 workqueue
或 smp_call_function_single
,從 sk->sk_hashcpu
拿到當初插入時的 CPU,然後再安排一個工作到那顆 CPU 上去執行真正的 inet_unhash
。
提出此一例子的原因為單純的概念講述讓我無法真正了解老師這句話的意思,有個實際例子可以將所學連結
公式錯誤,應為
比照從 CPU cache coherence 談 Linux spinlock 可擴展能力議題,設計數學分析 (機率統計/排隊理論) 來量化 Linux 核心的 qspinlock (建構於 MCS lock 之上)
根據 Non-scalable locks are dangerous
其各穩定階段的機率為
然而 MCS 消彌 CPU cache coherence,因此 service rate 就從 變成 其 為移交 lock 給下一個 CPU 所做的 cache coherence。
也就是
for
如此一來,可以求出等待核心的期望值
qspinlock 結合 ticket spinlock 與 MCS lock 因此我們可以借用兩者機率合併的 conditional function 概念
然而因為上式直接把兩個機率分布直接合併切分,違反科摩哥洛夫第二公設(歸一化):
for Ω 為整個樣本空間
因此考慮單純的 ticket-like lock 被使用情形與 lock 退化成 MCS-like lock ,嘗試將兩者機率利用以上兩種情形的發生機率進行合併。
定義 為當 qspinlock 處於 ticket-like lock 狀態時的機率,而 為處於 MCS lock 狀態的機率。
然而,此式的意思為 qspinlock 進入到 ticket-like lock 的機率與進入到 MCS lock 的機率互斥,省略 qspinlock 的轉移機制(進入到 MCS lock 表示進入過 ticket-like lock,並因為等待鎖的人數過多,所以轉移成 MCS lock)。
鑑於此,最好的方法就是從論文模型利用條件函數與 Birth-Death Process 重新推導。
Arrival rate
Service rate
當其 Markov model 其內狀態穩定時
故
其 由 導出。然而 的導出非常雜亂,因此先採用模擬的方法,透過改變參數,了解模型與 qspinlock 在不同程度的效果。
參數 | 意義 |
---|---|
𝑛 | CPU中的核數 |
𝑎 | 單核平均嘗試 acquire lock 間隔 |
𝑠 | critical section 的執行時間 |
𝑐 | 多核競爭造成的延遲增加率 |
𝑐′ | 鎖移交所需的 cache coherence 時間 |
利用 google colab
當 critical section 只有幾個 cycles 且 CPU 要求進入 lock 的頻率低時
上兩圖分別為穩定狀態的機率分佈與論文提出的 Speedup 衡量方法。前者可以看到 100 核的機率分佈在前面下切時有小跳動,表現出 qspinlock 切換模式的特性,而此參數所得出的期望值為 ,在 qspinlock 的表現只有 ticket-like lock,其在 Speedup 的表現也如論文相似,後者隨著核數上升在 140 到達了飽和,也是 qspinlock 的瓶頸 - 服務速度。
當 critical section 較大且 CPU 要求進入 lock 的頻率低時
若將執行 critical section 時間拉長,如前圖其期望值會落在 , qspinlock 會在超過 3 時會轉移成 MCS lock,也就是說,一個長的 critical section 會倒置 qpinlock 高機率轉移成 MCS lock ,另外,下面那張圖與第一個案例對比,發現其飽和臨界點與上限變小了。
同樣的,若以服務速度來看,如果提昇到達的速度(a 變小),也同樣會造成飽和臨界點與上限變小。
從模型模擬結果可以觀察到,qspinlock 在處理器核數增加初期展現出接近 ticket lock 的初期線性 speedup 表現,代表在低至中度競爭下,進入的 ticket-like fast path 能有效分散鎖的競爭壓力,讓每個新增的處理器核都能帶來近似的效能提升。
隨著處理器核數進一步增加,模擬結果顯示 speedup 並不會持續線性成長,而是趨於飽和。這種飽和行為反映出在高競爭情況下,qspinlock 進入 MCS-like queueing phase,藉由排隊來減少 cache bouncing 與 active spinning 的開銷,使得效能不再上升,但也沒有顯著下降。
總結來說,qspinlock 模型呈現出:
參照 Futex 驗證和評估和實作輕量級的 Mutex Lock,重現相關實驗、理解 futex 的驗證,並探討以 futex 為基礎的 lock 提升方案