服務器問題記錄

  •  頁面請求,不定時無響應

現象:前端頁面,有時會打不開;有時個別請求無返回信息;f12 查看請求,提示「no-referrer-when-downgrade」前端

分析過程:java

一、查看請求對應的服務端是否正常(查看服務器日誌),發現服務端對於請求能夠正常響應;從前端來看,同一個請求,有時有返回信息,有時無返回信息nginx

二、查看nginx access 日誌,發現部分請求返回http 499;同一個uri,有返回http 200 和http 499redis

三、查看nginx upstream 配置,發現配置中存在一個無效的服務端地址數據庫

結論:緩存

nginx 不會檢測upstream 中配置的服務器是否有效,當配置了無效的服務端地址時,請求經過nginx 轉發到該無效的服務器時,就會形成請求不可用,nginx 會將該請求的響應封裝爲 http 499服務器

  • dubbo 提示線程池已滿

現象:dubbo 提示線程池已滿;前端顯示服務不穩定多線程

分析過程:less

一、查看dubbo 服務日誌,日誌僅顯示線程池已滿ssh

二、查看服務對應的 error 日誌,發現zookeeper 分佈式鎖有時會釋放失敗,而後去查看zookeeper 日誌,未發現異常

三、阿里雲監控報警,數據庫CPU 佔比超過90%

結論:

查詢某列表未使用緩存,致使大量請求(每分鐘5W次左右)在短期內訪問數據庫(自己查詢速度沒問題,可是請求量太大),形成數據庫瓶頸,並對正常的寫業務形成影響,大量對於數據庫的訪問,都在排隊,形成響應時間過長,dubbo服務線程池壓滿

解決方案:

一、按需對查詢增長 redis 緩存,JVM 緩存,nginx 緩存

二、對數據庫進行讀寫分離處理,防止下一次大量請求致使的數據庫瓶頸問題

  • HttpClient 多線程異常

現象:

java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.

緣由:多線程狀態下,公用一個HttpClient對象,一個請求未結束,再次發起新的請求,就會報這個錯

解決方法:

一、低版本的HttpClient,可使用 ThreadSafeClientConnManager 來代替 BasicClientConnManager

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager();
cm.setMaxTotal(20);
HttpClient client = new DefaultHttpClient(cm, httpParams);

二、高版本的HttpClient,可使用 PoolingHttpClientConnectionManager

PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager();
pcm.setMaxTotal(20);
CloseableHttpClient client = HttpClients.custom().setConnectionManager(pcm).build();

  • MySql 存儲空間清理

數據文件的清理:使用 truncate table_name 來清理數據量多的表

使用delete 的話,不會釋放磁盤空間,須要使用:optimize table tab_name 來釋放。

注意:optimize 會鎖表,應在空閒時期進行處理

select sum(data_length + index_length + data_free) / 1024 / 1024 from information_schema.tables;

查詢數據文件所佔空間

  • 挖礦病毒 minerd

解決方案:

挖礦病毒假裝爲 ntp 進程,但正常的ntp進程名爲ntpd

rm -rf /var/spool/cron/crontabs
rm -rf ~/.ssh/KHK75NEOiq
rm -rf /opt/KHK75NEOiq33
rm -rf /opt/*
rm -rf /etc/init.d/ntp
rm -rf /usr/sbin/ntp
rm -rf /usr/local/etc
pkill minerd
kill -9 (/usr/sbin/ntp的進程號)

  • java 進程CPU和內存分析

一、top 命令查看cpu和內存佔用較大的進程pid

二、根據進程pid,查看內部線程佔用cpu狀況

ps -mp 1316 -o THREAD,tid,time | sort -rn | less

(sort -rn 以數值的方式進行逆序排列)

三、找出佔用cpu比較高的TID,須要將TID轉換爲十六進制,例如:printf "%x\n" 1731,結果 6c3

四、使用 jstack 1316 查看具體對應的線程

五、使用 jstat -gcutil 1316 1000 100 查看jvm內存和gc狀況

  • zookeeper 數據清理

./bin/zkCleanup.sh -n 50  使用 zookeeper 自帶的清理腳本,可清理 log 和 snapshot,-n 50 是指保留50個文件(注意:是log和snapshot各保留50個的意思)

zookeeper 版本在3.4 以上的,也能夠在配置中配置自動清理(zoo.cfg):

autopurge.snapRetainCount=50    # 保留50個

autopurge.purgeInterval=72    # 自動清理間隔,單位:小時

相關文章
相關標籤/搜索