关于内核inotify的一个程序优化案例

故事的起因是这样的:

因有需求对前端传来的文件进行实时处理,要求是实时用厂家的SDK请求处理这些文件,将结果实时写入后端数据库,所以写了实时转发程序A,原理采用了内核的inotify机制,监测上传目录下有文件创建后执行消费处理,nohup A 放在后台实时守护处理,消费程序 M和N 为两个厂家的python SDK,消费处理完后入MySQL数据库。

程序A:

#!/bin/sh

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin

/usr/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%f‘ -e create DIR |  while read file

#执行上面命令,是让inotifywait监听DIR目录,当监听到有发生create事件发生时,按%Xe %w%f的格式输出

do

python27 doM.py &

python27 doN.py &

done

但发现当文件量大后,程序A跑满了CPU,所以程序肯定有异常,所以开始寻找原因,因为上传目录都为一个目录,所以原本判断是否是硬件资源不够,IO/内存不够等导致CPU占用过高? 后来top/iostat等判断发现硬件根本没有瓶颈,我的服务器都是高配机,后来觉得是否是因为上传的目录下文件过多,导致内核处理的有延时?毕竟那目录下几万甚至几十W个文件呢,每台服务器每秒可能同时有几百个文件上传写入,所以对目录下文件进行定期删除处理,可是发现删除完之后CPU还是跑的有点高,虽然不跑满,但还是比较高啊,仔细想想A抛出两个进程,是否会是因为进程上下文切换CS过高导致的呢? 用vmstat发现,CS有40000+多,确实很高,所以决定先把B和C代码合并试一下,让A只抛出一个程序请求呢,改为:

#!/bin/sh

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin

/usr/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%f‘ -e create DIR |  while read file

#执行上面命令,是让inotifywait监听DIR目录,当监听到有发生create事件发生时,按%Xe %w%f的格式输出

do

python27 allDo.py &

done

此时再vmstat查看cs已经降低至8000了,程序A的cpu使用率降低了几十倍,心里舒坦了,世界安宁了,性能杠杆的

所以对于写多进程多线程时候容易出现此类问题吧。

时间: 2024-09-29 16:00:58

关于内核inotify的一个程序优化案例的相关文章

Oracle--SQL程序优化案例一

下面是存储过程的一部分程序: PROCEDURE SAP_MAN_ROUTING_SO (CITEM_ID    VARCHAR2,                                 CSITE_ID    VARCHAR2,                                 CTYPE       VARCHAR2)   IS      V_ROUTING   VARCHAR2 (40);        BEGIN                          

清算/报表/日终跑批程序之性能优化案例(一)

前言 不知不觉,技术人生系列·我和数据中心的故事来到了第五期.小y又和大家见面了! 前几期主要发了一些TroubleShooting的案例分享,其实小y最擅长的是性能优化,所以从这期开始,小y会陆续的分享更多的数据库性能优化案例. 进入正题,如果您的日终跑批/清算/报表等程序时快时慢,或者从某一天以后就一直变慢,作为运维DBA或开发的您,会怎么下手?还有,除了解决问题外,你要如何解答领导最关心的一个问题,"为什么现在有问题,但是以前没有问题呢"! 小y今天要和大家分享的就是这样一个性能

Linux内核学习--写一个c程序,并在内核中编译,运行

20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,"忍不住"跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直接从代码入手,下面来写一个hello.c内核模块. 说明: 这个路径/usr/src/linux-headers-2.6.32-22/include/linux是引用的头文件. 内核模块固定格式:module_init()/ module_exit(),module函数是从头文件中来的.

Java 程序优化 (读书笔记)

--From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版) 1. java性能调优概述 1.1 性能概述 程序性能: 执行速度,内存分配,启动时间, 负载承受能力. 性能指标: 执行时间,CPU时间,内存分配,磁盘吞吐量,网络吞吐量,响应时间. 优化策略: 木桶原理,优化性能瓶颈. 1.2 性能调优的层次 设计调优, 代码调优, JVM调优, 数据库调优, 操作系统调优. 2. 设计优化 2.1 善用设计模式 单例模式: 对于巨大对象,节省创建对象的时间空间: 代理

【转】CUDA程序优化要点

CUDA程序优化应该考虑的点:精度:只在关键步骤使用双精度,其他部分仍然使用单精度浮点以获得指令吞吐量和精度的平衡: 目前 GPU 的单精度性能要远远超过双精度性能,整数乘法.求模.求余等运算的指令吞吐量也较为有限.在科学计算中,由于需要处理的数据量巨大,往往采用双精度或者四精度才能获得可靠的结果,目前的 Tesla 架构还不能很好的满足高精度计算的需要.如果你的计算需要很高的精度,或者需要进行很多轮的迭代,最好考虑在关键的步骤中使用双精度,而在其他部分仍然使用单精度浮点以获得指令吞吐量和精度的

CSDN日报20170318——《一个程序员的五年工作总结》

[程序人生]一个程序员的五年工作总结 作者:Programmer_Zhou 三月的重庆到处弥漫着浓浓的春味,在这个春暖花开的季节里,人们在闲暇的时间都忙着踏青和春游."一年之计在于春",春天是赏花旅游的季节,春天更是为未来作打算.定计划的时候.在2017年的春天,我做出了人生中的一个重要决定:离开工作近五年的ZTE(中兴通讯),去开启新的人生征程.最近我在罗辑思维的得到APP上订阅了薛兆丰老师的"北大经济学课"专栏,我认为他说的一句话特别有道理,这句话的大意是:&q

GPU 编程入门到精通(五)之 GPU 程序优化进阶

博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识.鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程. 有志同道合的小伙伴,欢迎一起交流和学习.我的邮箱: [email protected] .使用的是自己的老古董笔记本上面的 Geforce 103m 显卡,尽管显卡相对于如今主流的系列已经很的弱,可是对于学习来说.还是能够用的.本系列博文也遵从由简单到复杂,记录自己学习的过程. 0. 文件夹 GPU 编程入门到精通

GPU 编程入门到精通(四)之 GPU 程序优化

博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴.欢迎一起交流和学习,我的邮箱: [email protected] . 使用的是自己的老古董笔记本上面的 Geforce 103m 显卡,尽管显卡相对于如今主流的系列已经很的弱.可是对于学习来说,还是能够用的.本系列博文也遵从由简单到复杂.记录自己学习的过程. 0. 文件夹 GPU 编程入门到精通

关于C#程序优化的五十种方法

关于C#程序优化的五十种方法 这篇文章主要介绍了C#程序优化的五十个需要注意的地方,使用c#开发的朋友可以看下 一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处: 2.在属性的get和set访问器重可使用lock添加多线程的支持. 二.readonly(运行时常量)和const(编译时常量) 1.const只可用于基元类型.枚举.字符串,而readonly则可以是任何的类型: 2.const在编译时将替换成具体的常量,这样如果在引用中同时使用了con