轉--Server “**” has shut down the connection prematurely一例分析


近幾天在性能測試過程中,發現loadrunner Controller經常報 Server “**” has shut down the connection prematurely 。概率很高,現象很奇怪。網上有很多說法,各有不同,但貌似都不正確,只能靠自己追蹤。
根據經驗仔細分析,發現可能跟下列因素有關:
 (1)loadrunner客戶端服務器網卡資源不足;
 (2)tcp/ip或者http connection keepalive連接超時時間設置太長,造成無連接可用;
 (3)應用服務端有問題。

一、用事實做詳細的對比:

   分析:從對比結果來看,shut down的比例跟loadrunner客戶端確實有關系,但無論客戶端怎樣改變,還是該現象出現,而且比例始終超過萬分之1。

 

loadrunner服務器數量

TcpTimedWaitDelay鍵值

並發用戶數

平均TPS

shut down比例

1台

30s

13

76.195

萬分之18.4

1台

10s

7

66.49

萬分之10.8

2台

10s

7

85.994

萬分之1.39

2台

10s

2

33.544

萬分之1.23

 

 至此,可以排除loadrunner客戶端的原因。

二、轉向服務端,在dpm服務器上,發現apache占用很大的資源,而且有報錯:
   (1)在壓力情況下,apache(httpd進程)占用的物理內存,平均每秒增漲4M,非常恐怖;
   (2)Apache日志中有三類報錯信息:
      a、 [Tue Jun 30 18:54:37 2009] [error] [client 192.168.**.**] unable to init Zlib: deflateInit2 returned -4: URL /distributor/product/my_product_list.htm
      b、 [Tue Jun 30 18:54:38 2009] [notice] child pid 28699 exit signal Segmentation fault (11)
      c、Memory allocation failed.

  分析:經過觀察,推論出httpd進程占用物理內存狂增,導致服務器沒有剩余資源分配給它,造成memory allocation failed。

三、修改和屏蔽一些apache配置項,例如減少SendBufferSize所占空間、屏蔽CustomLog日志。都無濟於事。

問題到底出在哪? 欲知后事如何,敬請關注該主題的下一篇blog。

上一篇Blog講到,性能測試過程中發現server shut down現象,經過追蹤,定位到是apache子進程狂吃內存。

根據經驗,判斷問題可能出在apche加載某個/某些模塊上。於是,使用“拆分問題,隔離分析”的分析方法。先隔離出apache加載的所有模塊。再采取注釋、重啟、驗證的方式,逐步縮小隔離范圍。最終定位出瓶頸點。

系apache在加載一個Taobao**_module時,每秒消耗4M內存,導致apache占用的物理內存不斷增漲,當漲至操作系統能分配給apache的最大內存時,apache子進程死掉。在老的子進程死亡和新的子進程創建的時間間隔,有請求過來,系統自然沒有響應,從loadrunner那端看,就是server shut down。

真相得以大明。接下來就是對這個模塊進行優化了。

一個 1.84/千 ,背后竟然隱含如此巨大的性能問題。如果不深究,問題很快就被忽視了,系統上線之后,不被上帝眷顧的用戶很有可能就打不開網頁了。整個瓶頸查找的過程,我想可以讓我們想到以下幾點:

1. 性能測試工程師需要具備敏銳的觀察力,再小的概率,只要出錯,必定深究;

2. 性能測試工程師需要有清晰的思路,先查什么,后查什么,要設計得很明確;

3.  除了注重jboss和java程序,apache也應當重點關注,特別是出現error的時候;

4. “拆分問題,隔離分析”的方法確實很實用;

5. 盡信書不如無書,遇到具體問題要具體分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM