首页
登录 | 注册

用Devel::NYTProf模块排查优化perl脚本性能

缓存服务器上有一个perl写的日志分析脚本,记录所有不重复的url。之后对squid进行目录刷新时,从记录下来的文件中查找匹配的url即可。
不过这些天服务器老是出现负载报警,用top观察,这个url_parser.pl脚本一旦执行时,就占用了高达90%的CPU和40%的MEM。wc看存储的url.list文件,有大概4,000,000行;url.`date`.list当前有140,000行。
于是上CU去请教perl执行效率的查找思路。
回复有:1、正则精准度;2、文件读取效率;3、全局变量数;4、频繁打开句柄;5、流程优化
比如读取文件不要用@line=FILE用while();正则^句首带上/oi;注意哈希表与内存交换区等等;最后推荐给我Devel::NYTProf,进行测试。
perl -MCPAN -e shell
>install JSON::Any(不安这个东东,在nyt生成html的时候会报warning,不过不安也可以)
>install Devel::NYTProf
然后采用perl -d:NYTProf /home/purge/url_parser.pl运行脚本,会在当前路径下生成nytprof.out。
再用nytprofhtml nytprof.out生成web页面。
另开一个apache,将生成的nytprof目录发布出来。用ie打开即可看到了,如下:
 
下面还有载入模块的时间。之前我用strace跟踪了一下脚本的运行,发现在载入pm的时候,perl会搜索好多乱七八糟的目录,最后才正确,还一度担心是因为这个原因浪费了时间和资源呢。不过根据测试结果来看,载入模块总共花了不到30ms,不是什么可怕的事情。
然后点击/home/purge/url_parser.pl的reports(line·block·sub),可以看到具体每个语句的执行情况:
 
打开十四万行的url文件花了2.14s,然后再用2.09s将它们载入哈希表中;
 
打开正在运行的access.log(5分钟截取一次,squidclient mgr:5min里rps为17.65,即大概该有5000行以下;结果显示是3306 calls)并截取其中的url,花了141ms,然后再用42.6ms载入哈希表中;
 
最后,用919ms对哈希表排序,用1.58s重记录整个url文件。
(143677-143579=98,即3306条日志中有98条是新增url)
注意到第二张图中,对access.log分析时,match那步,每行花了30us!而在对urllist和tmplog分析时,每行只花3-4us的样子。看来是这一步的正则写的不好了,如右:my $log_pattern   = qr '^.*?\d+\s+\w+\s+(http:\/\/.+?)\s+.+';
根据日志的格式和需求,改成这样my $log_pattern   = qr '\s(http:\/\/.+?)\s';其他不变,再次测试,该部分的测试结果如下:
 
降低成7us每行啦!效果明显呀~~

相关文章

  • Perl的优势之一是其有庞大的CPAN库,安装这些库有很多方法. 一.通过专用的模块安装模块来安装模块 优点是可以解决依赖问题, 有三个模块,分别是cpan,cpanp,cpanm. 1. CPAN模块. cpan是一个重量级选手. Red ...
  • 用 Net::SSH::Perl 实现不用建信任关系 ssh连接操作
        平时,要自动ssh到远程主机上做操作时,都要建立信任关系,这样在连接时,才不用输入密码. 就想不用建立信任关系的情况下,来自动ssh连接到远程主机做操作.可以用提供一个所要连接的远程主机列表来实现这个功能.列表里提供了主机IP,用户 ...
  •  更多Java培训.Java视频教程学习资料,请登录尚硅谷网站下载:www.atguigu.com  ?1. 背景及目标? 厦门游家公司(4399.com)用于员工培训和分享.? 针对用户群为已经使用过mysql环境,并有一定开发经验的工程 ...
  • 性能优化方法和技巧
    系列目录 性能优化方法和技巧性能优化的方法和技巧:概述性能优化的方法和技巧:代码性能优化的方法和技巧:工具 这是一个可以用一本书来讲的话题,用一系列博客来讲,可能会比较单薄一点,这里只捡重要的说,忽略很多细节,当然以后还可以补充和扩展这个话 ...
  • 简单描述PHP发展历程
    PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域.PHP ...
  • 【原创】利用inotify+rsync实现linux文件批量更新
    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://blog.chinaunix.net/space.php?uid=9419692&do=blog&id=3 ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.013 s.
京ICP备10005923号