解決texlive化學式轉換鏡像經常偶發性進程堆積導致卡頓問題

前言

之前在 使用Python定時清理運行超時的pdflatex殭屍進程 博文中我採用python腳本開啟定時任務清理pdflatex殭屍進程,線上4u2G的k8s pod部署了3個,pdflatex執行過程是是比較耗cpu的,記憶體佔用微乎其微,但是pod在實際在運行中偶爾還是會出現一些問題

問題

問題一:K8s POD存儲超過100M,POD down了,但是資源沒有被回收,導致k8s命名空間資源被空耗
問題二:每隔一段時間偶發性單個pod進程積壓,定時清理腳本會down掉,清理任務無法正常運行
問題三:主要是你還不知道那個pod有問題,所有的請求都是通過k8s負載均衡到各個pod中去,一旦路由到有問題的pod,請求就掛起了,你得本地配置kubectl進入到生產的pod中去查看進程,找到問題pod,手動清理進程然後重啟清理任務,但是清理完你會發現過幾天又會出現同樣的問題,人肉運維負擔很重

解決

問題一
第一個問題的產生是由於我們在執行pdflatex時候會生成tex和pdf文件,當我們正常執行完成之後,會清理這些文件,但是如果是殭屍進程的話,我們在清理進程的時候也需要把進程對應的文件清理掉,清理腳本如下:

def clean_files():
    nowtime = datetime.datetime.now()
    # 獲取時間差5分鐘(因為文件創建超過5分鐘的要刪除掉)
    deltime = datetime.timedelta(seconds=120)
    # 獲取當前時間減去5分鐘時間差
    nd = nowtime - deltime
    path = "/home/"
    files = os.listdir(path)
    for file in files:
        filectime = get_filectime(path + file)
        if filectime < nd and len(file) > 32:
            os.remove(path + file)
            logging.info("清理文件:"+file)

問題二
第二個問題比較嚴重,產生的原因有如下幾個:

1、clean_files 偶發性異常,導致定時任務掛掉,這裡已經判斷了文件創建時間5分鐘在執行刪除偶發性出現文件找不到的異常,導致清理定時任務掛掉,判斷是由於pdflatex進程積壓導致clean_files一直沒有拿到cpu的執行權,當執行os.remove的時候那些「不正常」的文件被「正常」的進程清理掉了,導致報錯
2、p.terminate()方法沒有生效,這一塊應當是texlive的bug導致,之前的清理進程我在部署生產的時候放到10分鐘執行一次,但是由於pdflatex的cpu消耗較多,如果有較多的錯誤語法的轉換或者稍高一點的並發,都是導致短暫是cpu壓力陡增,這時部分pdflatex進程已經假死,直接給進程發送terminate指令,進程也無法響應

解決:第一個問題比較簡單,try catch包裹一下,一次執行失敗下次執行即可,無傷大雅;第二問題,問題沒有定位出來,偶發性的,有的節點運行了幾個月也都沒有問題,但是就是偶爾有個新節點老是喜歡出問題,沒轍了只能暴力點,上程式碼

def process_checker():
    try:
        logging.info("pdflatex進程清理")
        os.system("kill -9 `ps -ef | grep pdflatex | grep pdftex | awk '{print $1}'`")
    except Exception as e:
        logging.error("清理進程出錯")

    try:
        clean_files()
        logging.info("文件清理成功")
    except Exception as e:
        logging.error("清理文件出錯")

其實一開始我用的是kill想平滑一點,但是運行一段時間發現根本kill不掉,所以加了個 -9 來終結那些令人糟心的進程

定時任務也去掉了,一切從簡,while循環,每次睡60秒,循環里的程式碼try catch,確保如果高峰期某個節點發生卡頓可以在一分鐘內自動恢復,這樣就免去了人肉運維,並且又在生產環境增加了兩個實例,好長一段時間都沒有回饋卡頓的問題了