扼殺伺服器效能的10條戒律(2)

來源:互聯網
上載者:User
伺服器|效能 應該對資料結構使用全域鎖

使資料安全執行緒的最簡單方法是把它套上一把大鎖。為簡單起見,所有的東西都用同一把鎖。這種方法會有一個問題:序列化。為了得到鎖,每一個要處理資料的線程都必須排隊等候。如果線程被一把鎖阻塞,它沒有在做任何有用的事。當伺服器的負載較輕時,這個問題並不常見,因為一次可能只有一個線程需要鎖。在負載很重的情況下,對鎖的激烈爭奪可能就會成為一個大問題。

設想在多車道高速公路上發生了一個意外事故,這條高速公路上的所有車輛都被轉向一條狹窄的道路。如果車輛很少,這一轉換對交通流的速率的影響可以忽略。如果車輛很多,當車輛慢慢併入那條單通道時,交通阻塞會延伸幾英裡。

有幾種技術能夠減少鎖競爭。

· 不要過分保護,也就是說,不是非常必要不要鎖住資料。只有需要時才去持有鎖,而且時間不要過長。不要在大段代碼周圍或頻繁執行的代碼中沒必要地使用鎖,這一點很重要。
· 對資料進行分割,使它能夠用一套獨立的鎖保護。例如,一個符號表可以按標識符的第一個字母分割,這樣在修改名字以Q開頭的符號的值時,就不會去讀名字以H開頭的符號的值。
· 使用APIs的Interlocked 系列(InterlockedIncrement,InterlockedCompareExchangePointer等)自動修改資料而不需要鎖。
· 當資料不是經常被修改時可以使用多讀者/單作者(multi-reader/single-writer)鎖。你將獲得更好的並發性,儘管鎖操作的代價將更高並且你可能會冒餓死作者的危險。
· 在關鍵區段使用迴圈計數器。參見Windows NT 4.0 service pack 3中的SetCriticalSectionSpinCount API。
· 如果你不能得到鎖,使用TryEnterCriticalSection並做一些其他的有用的工作。

高競爭導致serialization,serialization導致降低CPU的利用率,這促使使用者加入更多的線程,結果事情變得更糟。


不必注意多處理器機器

你的代碼在多處理器系統上比在單一處理器系統上運行得還要糟,這可能是件令人噁心的事。一個很自然的想法是,在一個N維繫統上運行N次會更好。效能很差的原因是競爭:鎖競爭,匯流排競爭,和/或緩衝列競爭。處理器都在是爭奪共用資源的所有權,而不是做更多的工作。

如果你一定要編寫多線程應用程式的話,你應該在多處理器盒上對你的應用程式進行強度測試和效能測試。單一處理器系統通過時間分區地執行線程而提供一個並發性的假象。多處理器盒具有真正的並發性,競爭環境和競爭更容易發生。

應該始終使用模組化調用;他們很有趣。

利用同步模組化調用來執行I/O操作對大多數傳統型應用程式來說是合適的。但是,他們不是使用伺服器上的CPU(s)的好方法。I/O操作要花費上百萬個刻度來完成,這些刻度本來可以被更好地利用。利用非同步I/O你能得到顯著提高的使用者請求率和I/O通量,不過增加了額外的複雜性。

如果你有需要花費很長時間的模組化調用或I/O操作,你應該考調撥多少資源給他們。你想使用所有的線程還是有個限制?一般地,使用有限的幾個線程要好些。構建一個小的線程池和隊列,利用隊列來安排線程的工作完成模組化調用。這樣,其他線程就可以拾取和處理你的非模組化的請求。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。