博客 / 詳情

返回

一種高併發下的自旋鎖優化方案

本文分享自天翼雲開發者社區《一種高併發下的自旋鎖優化方案》.作者:星空趕路者

1.問題背景

CDN線上有一些節點機器cpu存在突刺,都是在晚上業務高峯期才出現。該節點存在大量的小文件訪問,使用了固態硬盤。經過線下壓測模擬復現了線上的問題現象。

 

2.問題原因

通過工具發現cpu突刺時的堆棧信息在對一張共享內存哈希表進行非常高頻的更新與訪問。主要原因為:1.需要更新當前主機url的訪問量信息。2需要提供查詢接口當前主機url的訪問信息。

由於存在對臨界資源的更新和訪問,需要對讀寫加鎖。目前鎖為自旋鎖,自旋鎖在加鎖不成功時,一直嘗試不會釋放cpu資源。當臨界區操作很短暫時,自旋鎖處理的性能就非常高。但如果很多個進程(80個nginx worker進程)同時競爭一把自旋鎖時,就會導致鎖衝突加劇,cpu突刺明顯。由於不能及時釋放cpu計算資源,對主機上的其他進程也會產生影響。

 

3.優化方案

為了避免n多個進程競爭同一把自旋鎖,需要對鎖進行分級管理:分為外層鎖和內層鎖。外層鎖只有有限的N把,內層鎖只有一把。

進程在讀寫共享內存哈希表之前,根據一定的哈希算法,哈希到某個外層鎖加鎖,只有加鎖成功後,才有資格對內層鎖加鎖。

如果外層鎖加鎖失敗,則調度後續其他請求繼續處理,將本次請求放到調度隊列最後。最終競爭內存自旋鎖的只有有限的幾個進程。這樣就大大降低了衝突概率。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.