文章出處

1. 鎖的使用

鎖是影響服務器程序性能的第一大殺手。服務器程序一般都是多線程或是多線程的,鎖肯定避免不了。對于鎖的使用,第一點就是減小鎖的粒度。比如mysql有行鎖,表鎖,各種粒度不同的鎖。在需要加鎖的地方,選擇粒度最小的鎖。第二點,使用一些高性能的鎖,比如讀寫鎖,自旋鎖。這個要根據具體的應用場景來選擇。另外還有一些應用級別的鎖,比如電商系統里面,用來減庫存的樂觀鎖,與其對應的則是悲觀鎖。另外,還可以通過優化代碼,來達到無鎖化操作。

2. 內存使用

在一個內存操作密集型的服務器程序上,對內存的使用優化肯定也是必不可少的。首先,是使用內存池,來避免內存的頻繁申請與釋放。其次,減少不必要的memset與memcpy。比如,我們的流媒體服務器,發送媒體流的過程就是一個不斷申請釋放內存的操作。對于申請的內存,我們就沒必要給它清零,因為發送的時候,都會指定發送長度。申請的內存使用了多少,就發送多少,不需要上來就清零。對于內存拷貝而言,比如我們在寫網絡程序時,socket收到的數據包會讀到一塊緩存里面,那么在解析的時候,盡量不要再將數據拷貝到另一塊內存上解析。我們還可以自己實現memcpy等函數,利用cpu的特性,每次操作4個字節或是8個字節,根據操作系統的位數決定。還有就是盡量減少用戶空間與內核空間的內存拷貝操作,比如使用一些零拷貝的函數,sendfile ,mmap等

3. 多線程

服務器程序,應該禁止動態創建線程。所有的線程應該在程序初始化時就創建,直至程序運行結束。當然也有一些場景,可以惰性化開啟。比如在業務第一次觸發時,開啟相應線程,之后就不需要再關閉了。對于線程池的使用,要選擇合理的線程個數。線程太小,無法發揮處理器的多核優勢;線程太多,系統會消耗很多性能在線程切換上。一般來說,線程的數量是處理器核心數量的兩倍

4. 網絡

高并發離不開網絡性能,I/O密集型的程序,linux上使用epoll, bsd上的kquene,windows有iocp,這些就不細講了,之前的博文中有介紹

5.異步化

服務器之間相互依賴的接口,盡量實現成異步的,這樣就不需要阻塞調用線程,減少因為網絡原因引起的等待

6.與客戶端的交互

所有的服務器都給客戶端提供服務,應該盡量減少與客戶端的交互過程。即做到在每次交互中,處理更多的事情。比如我們自己實現的流媒體服務器,剛開始點播流的時候,要發一些信令報文。之前我們需要三次交互,才能開始發流,后來通過消息合并,節省了一步。不要小看這一小步,在網絡不好的情況下,可能就會減少很多點播時延


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()