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

蒲公英的狂想 發表於 2021-12-01

前言

之前在 使用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,確保如果高峰期某個節點發生卡頓可以在一分鐘內自動恢復,這樣就免去了人肉運維,並且又在生產環境增加了兩個例項,好長一段時間都沒有反饋卡頓的問題了