一個鏈接引發的血案---------服務器 IO及網絡流量暴漲解決歷程

http://www.cnblogs.com/hurner/p/ubuntu_IO_net_explosion.html

在這裏介紹一次因爲更改網站地址而引發服務器IO讀取速度,網絡流入流出速度暴漲10倍的解決經歷。

環境:Ubuntu + Nginx + php-cgi + Wordpress

事情是這樣的,現在網站使用的wordpress搭建的,網址爲www.main.com(一個例子), 因爲要啓用新站點news.main.com,於是開啓wordpress multi sites的功能。

開啓MS功能過程中,受Wordpress MS 本身的限制,需要將之前的www.main.com更改爲main.com, 這樣子才能添加網站news.main.com。 否則就成了news.www.main.com。

 

在一個月黑風高的晚上把網址作了更改,開啓了Multi Site功能,訪問都沒問題,爲了萬全,還在發佈新文章試試,一切OK後,就上牀睡覺去了。

早上起來第一件事就是看網站能不能正常打開,到監控監控頁查看各項資源。驚訝的發現IO讀寫速度,網絡流入流出速度都出現了十倍的增長。下面是正常情況下的數字(依次是CPU, IO讀速度,IO寫速度,網絡流出速度,網絡流入速度),出問題時的截圖沒有保留下來,但記得IO讀寫速度都在250k/s左右,網絡流出速度在2M~5M之間,流入速度也在100k左右。

這樣子真的莫名其妙了,第一反應是難道某些插件不支持多站模式,特別是一些緩存插件。但覺得暫時還是不要懷疑這些插件,那些都是很成熟的插件,一時也沒有時間去研究他們的代碼去找原因。先把現象搞清楚,得先根上找原因。

 

 

因爲在更改wordpress配置時,也把ubuntu系統進行了一些update,所以先找找是否有什麼異常的服務或者一些特殊的端口。

 

1. 首先用netstat -tunlp

這些都是一些常用的msql, memcache, http,ssh, postfix, php-cgi的所需端口。68也是一個以前就開了的端口,網上查了,是DHCP 用的。

2. 另外一個和netstat差不多的命令nmap localhost:

沒有異常的東西。(有點納悶爲什麼沒有memcache的11211了)

3. 利用chkconfig -list查看一下開機啓動的服務。沒有什麼發現。

 

 

系統服務上沒有找到可疑這處,就再查看一下網絡流量,在網上查找了一些別人在這方面的經驗,首先有人推薦了nethogs.

1. nethogs eth0

上圖是正常情況下的數據。異常情況下時,也只能看到是nginx workproses的sent/received很大,但還是看不出來網站具體是哪裏出問題了。

2. 另外一個監控網絡的同類型軟件:iftop

sudo iftop -n -B -m 3000000

顯示如上,其實到這裏後我的思路就是先找出對應的IP後,再直接在nginx access日誌中就可以找出對應是哪個文件頻繁讀取了。但當時日誌確實也出現了一些問題,在iftop中顯示的這些ip竟然不在我的nginx access日誌,以至我懷疑難道這些ip是不是在訪問我電腦上別的80端口,心楊這是不可能的吧。於是暫時放下繼續找到底是哪些文件在頻繁被讀取呢?

ps: 在這裏做了一個嘗試,將顯示流量高的ip加到防火牆裏,沒有影響。

 

 

下一步,是爲什麼io那麼高呢,能不能搞清楚是哪個文件在頻繁被讀寫呢?

另外,之前也出過類似的問題,是因爲日誌切割不成功導致網站日誌太大而io太大,先檢查一下nginx網站日誌。

1. 檢查日誌分割

發現日誌確實有點大,但也沒有大到離譜的地步,就立即執行了一次人工分割。logrotate -vf /etc/logrotate.conf

2. iotop。

如下所示,還是隻顯示出來哪一個進程在用,而不是具體哪個文件被用。

3. 記得有一個可以列出所有打開的文件的命令的,最後了才試試這個: sudo lsof +s -n 

開始的時候把每一條都列出來,一一查找異常。 在其中先看到我的nginx access日誌讀寫,都還正常;再在後面的確發現了幾個對我服務器圖片的讀取。於是:

sudo lsof +s -n | grep public_html

(public_html是我的網站目錄)

然後在nginx access日誌裏面一查找,如下:

222.85.131.142 - - [12/Jul/2013:14:11:30 +0800] "GET /wp-content/uploads/2013/07/IMG_0604.jpg HTTP/1.1" 404 31 "-" "null (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" - 0.088 0.088 -
222.85.131.142 - - [12/Jul/2013:14:11:31 +0800] "GET /wp-content/uploads/2013/07/IMG_0604.jpg HTTP/1.1" 404 31 "-" "null (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" - 0.104 0.104 -
221.233.53.238 - - [12/Jul/2013:14:11:35 +0800] "GET /wp-content/uploads/2013/07/IMG_0604.jpg HTTP/1.1" 404 31 "-" "null (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" - 0.082 0.082 -
222.85.131.142 - - [12/Jul/2013:14:11:37 +0800] "GET /wp-content/uploads/2013/07/IMG_0604.jpg HTTP/1.1" 404 31 "-" "null (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" - 0.090 0.090 -
222.85.131.142 - - [12/Jul/2013:14:11:42 +0800] "GET /wp-content/uploads/2013/07/IMG_0604.jpg HTTP/1.1" 404 31 "-" "null (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" - 0.099 0.099 -
183.219.208.255 - - [12/Jul/2013:14:11:45 +0800] "GET /wp-content/uploads/2013/07/IMG_0604.jpg HTTP/1.1" 404 31 "-" "null (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" - 0.117 0.117 -
222.85.131.142 - - [12/Jul/2013:14:11:46 +0800] "GET /wp-content/uploads/2013/07/IMG_0604.jpg HTTP/1.1" 404 31 "-" "null (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" - 0.116 0.116 -
221.233.53.238 - - [12/Jul/2013:14:11:48 +0800] "GET /wp-content/uploads/2013/07/IMG_0604.jpg HTTP/1.1" 404 31 "-" "null (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" - 0.084 0.084 -

上面只是一部分,原來是從Flipboard來的。(還有一個疑問,第一次的時候在nginx.access日誌竟然查找不到lsof裏顯示的文件

納悶,我們配置了cdn,怎麼會有這麼量大的圖片訪問跑到我們服務器上來呢,於是找到了包含這個圖片的文章,一查看源碼,圖片地址果然是我們自己服務器的地址而不是cdn的服務器。至此,情況漸漸明瞭:

我的cdn功能是這麼實現的:將文章內我們網站地址鏈接都更換成cdn服務器的。之前網站地址配置爲http://www.main.com時,文章裏的圖片鏈接都是http://www.main.com, 我現在將主站地址配置爲http://main.com後,cdn功鏈接替換也只對http://main.com有效了,於是以前的那些文章中的圖片都沒有cdn功能了,悲劇了。

找到問題之後,就好辦了,試驗了一個sql腳本,就在當天晚上在服務器數據庫上跑一遍,並且清空一下服務器緩存。

但還有一個小插曲,第二天到了公司後,發現io還是很高。雖然比之前降了不少,於是按照上面的方法查找哪些文件被這麼頻繁讀取,查了之後還是上面那個圖片(IMG_0604)特別多。發現是從Flipboard來的,於是找旁邊一個同事借了他的ipad用Flipboard看了一下這篇文章,但不知道如何在ipad裏查看圖片源鏈接。一看到是Flipboard心裏差不多明白了:之前還替Flipboard準備過一個專門的rss輸出的,而且rss是有很變態的緩存,肯定是Flipboard緩存了這篇文章而且不帶cdn效果,碰巧這篇文章還挺熱鬧,給我們引入了大的PV的同時也增加了我們的負載。

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