前幾天,我們就接到其他應用負責人的電話,說我們rate應用的http響應超時,導致頁面上調用他們json接口的數據也顯示很慢。
觀察一下,大喫一驚。
隨便打開一張商品的頁面,其中的兩個json接口超時非常嚴重,分別是9秒,10秒。
再看看監控工具中統計出來的響應時間,如下圖:
在高峯期,響應時間都快到5秒了。嚴重影響到了用戶體驗。
再看看取數據接口的性能:
即使是從數據庫取數據,平均時間連1.5毫秒都不到。這裏根本不會是瓶頸。於是把問題定位到了Apache。Http請求過多,導致響應過慢。
之前,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設爲2048,ThreadsPerChild * ServerLimit還是等於1024,是沒有效果的。
在這次優化中,我們把MaxClient設爲2048, ThreadsPerChild設爲64, ServerLimit設爲32
MaxSpareThreads表示最多的空閒線程數。一個請求過來,如果線程池裏有現成的線程,就直接處理該
請求,否則創建新的線程。在高峯期rate有200多的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 毛導