解决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,确保如果高峰期某个节点发生卡顿可以在一分钟内自动恢复,这样就免去了人肉运维,并且又在生产环境增加了两个实例,好长一段时间都没有反馈卡顿的问题了
解决texlive化学式转换镜像经常偶发性进程堆积导致卡顿问题的更多相关文章
- 解决iPhone滑动时滑到另一个层级导致卡顿问题
问题概览: 两个div都可以滑动时,会造成滑动顶层div时,底层div也会跟着滑动.如图示. 解决方法: 添加CSS即可. 代码如下 * { -webkit-overflow-scrolling: t ...
- 解决Vue-cli3.0下scss文件编译过慢、卡顿问题
在使用Vue-cli 3.0构建的项目中,可能存在项目编译过慢的问题,具体表现在编译时会在某一进度比如40%时停顿,等好一会儿才能够编译完成.这使得浏览器中的实时预览也会卡顿,不利于我们快速查看效果, ...
- 解决拼团首页swiper组件手动轮播卡顿问题
解决 swiper lag , 可能是渲染背景backface-visibility后导致卡顿吧! //以下代码添加到.swiper-wrapper中 -webkit-perspective: 300 ...
- 【C++】解决vs2015经常卡顿的办法
VS2015经常性的卡顿,参考了zhihu里问答的办法,编译和使用的时候的确快多了 为什么vs2015经常卡顿? https://www.zhihu.com/question/34911426 感谢z ...
- 说说C#的async和await 解决卡顿问题 转
C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: 可以看到,async和await关键字只是把上面的代码变得更简单易懂而已. public cla ...
- img加载卡顿,解决办法
我觉得我在这个项目里遇到了太多的第一次.比如上一篇博文:在在360.UC等浏览器,img不加载原因. 当前情况是:图片加载缓慢,图片加载时出现卡顿. 上图:我缩放了图片,估计有点变形.能说明情况就行, ...
- 关于codeforces国内访问卡顿慢的最新解决办法,谷歌字体库/屏蔽facebook链接
在host里最后加上 方法起源来自于https://blog.csdn.net/qq_40693171/article/details/83623409 但是里面的360字体库已经停运http://w ...
- Android App解决卡顿慢之内存抖动及内存泄漏(发现和定位)
内存抖动是指在短时间内有大量的对象被创建或者被回收的现象,内存抖动出现原因主要是频繁(很重要)在循环里创建对象(导致大量对象在短时间内被创建,由于新对象是要占用内存空间的而且是频繁,如果一次或者两次在 ...
- 【Mac】解决「另一个活跃的 Homebrew 进程正在进行中」问题
问题描述 在安装 tesseract 的语言包时,由于网络下载速度太慢,我按下 ctrl + z 退出了安装,当再次输入安装命令时,系统报错如下: 解决方法 使用以下命令删除 homebrew 进程锁 ...
随机推荐
- Python ThreadPoolExecutor 线程池导致内存暴涨
背景 在有200W的任务需要取抓取的时候,目前采用的是线程池去抓取,最终导致内存暴涨. 原因 Threadpoolexcutor默认使用的是无界队列,如果消费任务的速度低于生产任务,那么会把生产任务无 ...
- 类图示例-订单系统 / Class Diagram - Order System
类图示例-订单系统 / Class Diagram - Order System 什么是类图? 类图通过显示它的类和它们之间的关系来概述系统.类图是静态的 - 它们显示交互的内容,但不显示交互时会发生 ...
- 封装ARX给.Net调用
1:创建工程名.def的文件,内容如下: 2:def文件位置: 3:属性页配置: 4:acrxEntryPoint.cpp下面添加如下代码(可以传参数) 5:c#调用 怕自己忘记,记录一下.
- 面试题系列:new String("abc")创建了几个对象
new String("abc")创建了几个对象 面试官考察点猜想 这种问题,考察你对JVM的理解程度.涉及到常量池.对象内存分配等问题. 涉及背景知识详解 在分析这个问题之前,我 ...
- Noip模拟57 2021.9.20
规律总结:联考必爆炸 T1 2A 没$A$掉的大水题,但是是真的不知道$000$前面的$00$也算先导$0$,以后要长记性,这种东西不能再错了 再打三遍: $000$前面的$00$也算先导$0$ $0 ...
- STM32学习笔记之核心板PCB设计
PCB设计流程 PCB规则设置 设计规则的单位跟随画布属性里设置的单位,此处单位是mil.导线线宽最小为10mil;不同网络元素之间最小间距为8mil;孔外径为24mil,孔内径为12mil;线长不做 ...
- 用python检查矩阵的计算
鉴于最近复习线性代数计算量较大,且1800答案常常忽略一些逆阵.行列式的计算答案,故用Python写出矩阵的简单计算程序,便于检查出错的步骤. 1.行列式 可自行更改阶数 from numpy imp ...
- copy-list-with-random-pointer leetcode C++
A linked list is given such that each node contains an additional random pointer which could point t ...
- java中Map及Map.Entry详解
Map是java中的接口,Map.Entry是Map的一个内部接口. Map提供了一些常用方法,如keySet().entrySet()等方法. keySet()方法返回值是Map中key值的集合:e ...
- docker 加入域名
先运行docker镜像 # 进入 docker 容器 mynginx 是容器名 docker exec -i -t mynginx /bin/bash #安装vim apt-get install v ...