天天看點

排查calibre-web服務阻塞問題

目錄

問題

排查

本地複現

溯源

臨時解決

k8s叢集中使用linuxServer的linuxserver/docker-calibre-web鏡像部署了janeczku/calibre-web,在211011更新了最新的鏡像後,發現網頁頻繁出現無響應的狀況:浏覽器标簽頁持續保持轉圈的狀态,直到很久以後才會報逾時,且從此之後所有請求都無法正常完成。

經過多次嘗試,發現在前端複現該問題的操作方法是:編輯書籍,擷取中繼資料,點選儲存。

首先直接用<code>kubectl port-forward calibre-6c5c84fd4f-z2mgb 8083:12345</code>代理方式通路叢集内calibre的pod,繞過叢集中pod以外的其他網絡元件,比如traefik,排除叢集本身問題。發現問題依舊,初步排除叢集網絡問題。

此時需要看calibre-web日志:經過一番搜尋研究,發現該項目的日志不會輸出到stdout,而是位于項目目錄裡的<code>calibre-web.log</code>檔案。相應的,在容器内的位置是<code>/app/calibre-web/calibre-web.log</code>

日志檔案中看到很多重複的日志塊如下。初步懷疑是由于編輯書的中繼資料時請求了google scholar,但是由于傳回了status code 403,而相關代碼在處理請求重試時邏輯有誤導緻了無限重試,進一步導緻阻塞了web server主線程。

此時需要檢視janeczku/calibre-web的代碼邏輯,相關代碼如下:如果pip安裝了scholarly庫,則會去請求google scholor,否則會跳過。而項目把一些額外的pip依賴放到了單獨的requirements檔案<code>optional-requirements.txt</code>中。

檢視linuxserver/docker-calibre-web中的Dockerfile可以看到确實預設安裝<code>optional-requirements.txt</code>。

第一次在本地啟動calibre-web,僅安裝<code>requirements.txt</code>裡的依賴,此時可以正常編輯書籍的中繼資料。

<code>pip install optional-requirements.txt</code>後,再編輯書籍中繼資料,問題被複現。

本文問題的出現,和calibre web server側的代理情況密切相關,總結如下:

首先,顯然,不安裝scholarly,無論對google scholar的可達性如何都不會有問題

安裝啟用了scholarly後,如果通路google scholar正常,也不會有問題

安裝啟用了scholarly後,如果通路gogole scholar傳回403,則會出現本文描述的問題。

安裝啟用了scholarly後,如果server在國内,且未有任何proxy的情況下,經過測試,scholarly在重試超過最大次數後會抛出<code>MaxTriesExceededException</code>異常,在異常抛出之前server也會被阻塞,但抛出異常後恢複正常。

安裝scholarly,該庫提供通路google scholar的api。<code>pip install scholarly</code>

截取有問題的代碼片段如下,可以看到通路google 得到403 status code時會導緻循環無法跳出。

較快速的解決方法是:fork linuxserver/docker-calibre-web,在其中的dockerfile中加入<code>pip uninstall scholarly -y</code>,取消google scholar支援。

新建構的鏡像已上傳至docker hub:lwabish/calibre-web - Docker Image | Docker Hub。

繼續閱讀