1. 鎖的使用mysql
鎖是影響服務器程序性能的第一大殺手。服務器程序通常都是多線程或是多線程的,鎖確定避免不了。對於鎖的使用,第一點就是減少鎖的粒度。好比mysql有行鎖,表鎖,各類粒度不一樣的鎖。在須要加鎖的地方,選擇粒度最小的鎖。第二點,使用一些高性能的鎖,好比讀寫鎖,自旋鎖。這個要根據具體的應用場景來選擇。另外還有一些應用級別的鎖,好比電商系統裏面,用來減庫存的樂觀鎖,與其對應的則是悲觀鎖。另外,還能夠經過優化代碼,來達到無鎖化操做。linux
2. 內存使用sql
在一個內存操做密集型的服務器程序上,對內存的使用優化確定也是必不可少的。首先,是使用內存池,來避免內存的頻繁申請與釋放。其次,減小沒必要要的memset與memcpy。好比,咱們的流媒體服務器,發送媒體流的過程就是一個不斷申請釋放內存的操做。對於申請的內存,咱們就不必給它清零,由於發送的時候,都會指定發送長度。申請的內存使用了多少,就發送多少,不須要上來就清零。對於內存拷貝而言,好比咱們在寫網絡程序時,socket收到的數據包會讀到一塊緩存裏面,那麼在解析的時候,儘可能不要再將數據拷貝到另外一塊內存上解析。咱們還能夠本身實現memcpy等函數,利用cpu的特性,每次操做4個字節或是8個字節,根據操做系統的位數決定。還有就是儘可能減小用戶空間與內核空間的內存拷貝操做,好比使用一些零拷貝的函數,sendfile ,mmap等windows
3. 多線程緩存
服務器程序,應該禁止動態建立線程。全部的線程應該在程序初始化時就建立,直至程序運行結束。固然也有一些場景,能夠惰性化開啓。好比在業務第一次觸發時,開啓相應線程,以後就不須要再關閉了。對於線程池的使用,要選擇合理的線程個數。線程過小,沒法發揮處理器的多核優點;線程太多,系統會消耗不少性能在線程切換上。通常來講,線程的數量是處理器核心數量的兩倍服務器
4. 網絡網絡
高併發離不開網絡性能,I/O密集型的程序,linux上使用epoll, bsd上的kquene,windows有iocp,這些就不細講了,以前的博文中有介紹多線程
5.異步化併發
服務器之間相互依賴的接口,儘可能實現成異步的,這樣就不須要阻塞調用線程,減小由於網絡緣由引發的等待異步
6.與客戶端的交互
全部的服務器都給客戶端提供服務,應該儘可能減小與客戶端的交互過程。即作到在每次交互中,處理更多的事情。好比咱們本身實現的流媒體服務器,剛開始點播流的時候,要發一些信令報文。以前咱們須要三次交互,才能開始發流,後來經過消息合併,節省了一步。不要小看這一小步,在網絡很差的狀況下,可能就會減小不少點播時延