標籤:

OpenStack大規模部署優化之三:Quota鎖優化

當前OpenStack針對租戶的配額(Quota)管理是基於資料庫來實現,對配額進行操作過程中都是先加鎖再更新,這樣在並發操作過程中,會成為平靜點;本文針對這一問題以Nova Quota模型進行展開分析(Cinder/Neutron原理一樣),並給出優化思路。


1、Quota模型

Nova在對Quota管理過程中,在資料庫中涉及到三張表,QUOTA_USAGE(當前已使用的配額)、QUOTA(描述組合配額上限)、RESERVATIONS(維護中間態資源配額),其中QUOTA_USAGE核心欄位如下(後面兩張表不做介紹):

ID PROJECT_ID RESOURCE IN_USE n1 abc cpu 10n2 abc memory 4096n3 def CPU 20n4 def memory 2048n

各欄位描述如下: PROJECT_ID:租戶ID RESOUCE:為資源類型,比如CPU、內存等 IN_USE:當前已使用的值

2、Quota更新機制

當用戶在創建資源過程中,比如創VM,會對CPU、內存等Quota對應的IN_USE欄位會更新,其中更新方式是採用悲觀鎖,先採用selct for update對租戶對應的資源Quota多行進行加鎖,加鎖後再做更新操作,偽代碼如下;在並發創建虛擬機過程中,對資料庫多行加的鎖會成為瓶頸點(python協程會放大此瓶頸點,後續文章展開說明)

start_transaction:n with lock(row) //對應的SQL:select * from QUOTA_USAGE where PROJECT_ID=XXXX for updaten for resource, amount in requested_resource_changes:n // 獲取租戶對應的quotan in_use = db.get_quota(resource,tanent_id) // 對應SQL: select IN_USE from QUOTA_USAGE where PROJECT_ID=XXn if in_use == MAX_QUOTAn //已到上限值,返回失敗n return falsen // 更新quotan db.update_quota(resource,tanent_id, in_use+amount) //對應SQL:update QUOTA_USAGE set IN_USE=XX WHERE PROJECT_ID=XXncommit_transactionn

3、優化思路

基於資料庫的原子操作,採用樂觀鎖進行實現,先嘗試帶條件的更新,更新失敗說明超出了上限,則返回失敗,偽代碼如下:

for resource, amount in requested_resource_changes:n sql = "UPDATE quota_usage SET used = used + amount WHERE resource = $resource AND used + amount < MAX_QUOTA AND PROJECT_ID=xxx"n update_rows = execute_sql(sql)n if update_rows > 0n return OKn else return REACHED_MAX_QUOTAn

推薦閱讀:

解讀Mirantis最新的Neutron性能測試
優雅安裝OpenStack
Stateful firewall in OpenFlow based SDN
VLAN Trunk in OpenStack Neutron and SDN
如何從零開始學習OpenStack?

TAG:OpenStack |