大幅度提高web應用的性能案例


  
前幾天,我們就接到其他應用負責人的電話,說我們rate應用http響應超時,導致頁面上調用他們json接口的數據也顯示很慢。

        

         觀察一下,大喫一驚。

 

         隨便打開一張商品的頁面,其中的兩個json接口超時非常嚴重,分別是9秒,10秒。        

 

         再看看監控工具中統計出來的響應時間,如下圖:

 

 

         在高峯期,響應時間都快到5秒了。嚴重影響到了用戶體驗。

        

         再看看取數據接口的性能:

 


 

 

即使是從數據庫取數據,平均時間連1.5毫秒都不到。這裏根本不會是瓶頸。於是把問題定位到了ApacheHttp請求過多,導致響應過慢。

        

         之前,httpd.cnf的配置是這樣的:

         =============================================================

         Timeout 30

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 10

 

<IfModule worker.c>

     StartServers     5

     MaxClients       1024

     MinSpareThreads  25

     MaxSpareThreads  75

     ThreadsPerChild  64

     ThreadLimit      128

     ServerLimit      16

</IfModule>

=============================================================

 

MaxClients=1024,表示一個apahce最多隻能處理1024個請求。其餘的http請求都是浮雲,需要等待。

MaxClients的值是由ThreadsPerChild(每個子進程的線程數量) ServerLimit(子進程數量)決定的。

MaxClients = ThreadsPerChild * ServerLimit

如果你把MaxClient設爲2048ThreadsPerChild * ServerLimit還是等於1024,是沒有效果的。

 

在這次優化中,我們把MaxClient設爲2048, ThreadsPerChild設爲64, ServerLimit設爲32

 

MaxSpareThreads表示最多的空閒線程數。一個請求過來,如果線程池裏有現成的線程,就直接處理該

請求,否則創建新的線程。在高峯期rate200多的tps,最多75個空閒線程顯然太少了。

於是我們把這個值設爲250

 

KeepAlive表示HTTP的一次連接,可以進行多次傳輸。 rate應用的http場景裏,json接口對apache的壓力是最大的。

其中一個json接口一天要被訪問1700多萬次。Json接口一個特性就是隻取數據,沒有接下來的交互動作。於是我們就把

KeepAlive設爲off

 

最後的httpd.cnf配置是這樣的:

=============================================================

Timeout 30

KeepAlive off

MaxKeepAliveRequests 100

KeepAliveTimeout 10

 

<IfModule worker.c>

     ServerLimit      32

     StartServers     3

     MaxClients       2048

     MinSpareThreads  25

     MaxSpareThreads  250

     ThreadsPerChild  64

</IfModule>

=============================================================

 

看看修改後的效果:

 

 

左邊的紅框框表示昨天的高峯期響應時間,右邊表示今天的高峯期響應時間。

優化後的效果是非常非常的明顯。

 

最後看看系統的load:

 

 

我們的load比昨天有明顯地提高。這是正常的,因爲apahce的進程、線程多了。

 

by 毛導

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章