puppet recurse 导致的性能问题一例

简介:
很久之前使用puppet时遇到的一个问题,简单分享下。
1.监控team报一台机器的swap报警,机器内存使用出现问题,导致系统开始使用swap。

wKiom1Ll3q-SpX43AAHs8ShkFE0732.jpg

2.登录服务器,通过top –d 1 –c查看系统状况,发现puppet内存使用量很大,而且一直在增加,手动运行,发现一直运行不完。
spacer.gif wKioL1Ll3pyAYxbLAADoiMIieKk976.jpg

同时,分析puppet的运行日志,发现puppet开始运行的时间和内存监控图上面的趋势吻合,定位为puppet运行导致的问题。

3.手动运行puppet,并使用lsof和strace来定位问题。。
1)通过lsof发现系统打开了大量的file,并且都在调用lstat函数

lstat("/xxxxxx/live/b6c3506377254e9b879268aecbe77036/1338868/1338868515.block", {st_mode=S_IFREG|0644, st_size=261182, ...}) = 0

rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0

rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0

rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0

2)同时,strace来统计各个方法调用消耗的时间,发现消耗在 getdents函数上。

strace  -p 21741 -c

Process 21741 attached - interrupt to quit

Process 21741 detached

% time     seconds  usecs/call     calls    errors syscall

------ ----------- ----------- --------- --------- ----------------

95.65    0.040955          87       469           getdents

 4.22    0.001807           0    426525           rt_sigprocmask

 0.07    0.000030           0       235           lstat

 0.06    0.000026           0       235           close

 0.00    0.000000           0       235           open

 0.00    0.000000           0       235           lseek


lstat和getdents函数都是用来查看文件属性信息的。


4.查看puppet中module的代码,发现在这个目录下使用了file的资源,并使用了recurse的参数。

而由于业务的特殊性,这个目录下面会有大量的文件,这样就导致puppet在判断文件的属性上消耗了大量的时间,进而占用了大量的内存。

问题找到了,解决方法也很简单,去掉recurse就好了,里面小文件的属性就交给exec资源去处理吧。



本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1355020,如需转载请自行联系原作者
相关文章
|
8月前
|
Unix Linux 网络安全
|
网络安全
puppet 精通puppet配置管理工具
[agent] runinterval=3600 node "" { } node "a","b","c" { } node /*/ { } node default { } node "a" inherits base { } $a = "aa" ...
870 0
|
应用服务中间件 Unix Python
puppet单机模型
puppet配置 命令 facter -p: 显示所有的变量 puppet apply [-v] [--noop] puppet module puppet describe [-l] [list] 常用资源 file user group exec package service noti...
945 0
|
NoSQL Unix 应用服务中间件
|
网络安全 开发工具 Ruby
|
测试技术 应用服务中间件 Apache
|
Web App开发 Ubuntu 应用服务中间件