Rails性能優化一則

抓取系統周末的時候突然發現抓取的速度慢了很多,比平時的速度大約慢了一倍,于是習慣性地開始逐個方向進行問題的排查:

1、先檢查是否網速的問題,處在不同網絡下的兩臺服務器都出現了抓取速度變慢的現象,并且經過實際測試速度很快,排除網速的問題;

2、檢查服務器CPU、磁盤IO,發現CPU和IO占用均為較高值,有異常!而持續占用CPU的是mongodb進程;

3、于是按圖索驥,查看mongodb的日志文件,發現了大量的重復查詢:

Thu Aug 13 22:53:13.086 [conn34] command bidding.$cmd command: { count: "raw_htmls", query: { site_id: 613 } } ntoreturn:1 keyUpdates:0 numYields: 1 locks(micros) r:1075348 reslen:48 1047ms
Thu Aug 13 22:53:13.367 [conn31] command bidding.$cmd command: { count: "raw_htmls", query: { site_id: 19102 } } ntoreturn:1 keyUpdates:0 numYields: 12 locks(micros) r:2728177 reslen:48 1512ms
Thu Aug 13 22:53:13.687 [conn25] command bidding.$cmd command: { count: "raw_htmls", query: { site_id: 25226 } } ntoreturn:1 keyUpdates:0 numYields: 2 locks(micros) r:1720307 reslen:48 1155ms
Thu Aug 13 22:53:13.708 [conn32] command bidding.$cmd command: { count: "raw_htmls", query: { site_id: 15362 } } ntoreturn:1 keyUpdates:0 numYields: 2 locks(micros) r:2401703 reslen:48 1518ms
Thu Aug 13 22:53:14.124 [conn35] command bidding.$cmd command: { count: "raw_htmls", query: { site_id: 5278 } } ntoreturn:1 keyUpdates:0 numYields: 2 locks(micros) r:3090745 reslen:48 1641ms

持續頻繁出現,應該就是影響mongodb的原因了!

4、接著開始逐個審查最近提交的代碼,和查詢BaseSite::Config相關的,結果發現了這樣一段代碼:

    # 已抓取的數量
    def grabbed_count
        Raw::Html.where(site_id: self.id).count
  end

  def options
    _options = self.options||{}
 
    # 第一次抓取
    if self.grabbed_count==0
      _options['max_link'] = self.limit || '100'
    else
      _options['max_link'] = '100'
    end
    ....

    _options
  end

在options這個方法中,增加了一個是否首次抓取的判斷,這個判斷是通過grabbed_count方法來取出已抓取的頁面數量來確定的。問題就出在options這個方法在抓取的過程中會重復調用很多次,也就導致了這個count語句不斷在反復執行!

Raw::Html.where(site_id: self.id).count

找到問題,解決起來也就很簡單了,增加一個臨時的變量存儲grabbed_count的結果,避免重復查詢:

def grabbed_count
    if @grabbed_count.nil?
      @grabbed_count = Raw::Html.where(base_site_forum_id: self.origin_site_forum_id).count
    end
    @grabbed_count
end

提交代碼,重啟問題果然解決了!

經驗總結:
在寫查詢數據庫的語句的時候,心里面一定要預判這條語句在每次請求時執行的次數,以及加載數據的量,一時的疏忽可能導致的就是嚴重的性能問題。
另外就是看日志文件很重要,很重要,很重要?。ㄖ匾氖虑橐貜腿榕叮。?/p>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容