SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
R.I.Pienaar
February 2015
Puppet Performance
Profiling
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Who am I?
• Puppet user since 0.22.x
• Blog at http://devco.net
• Tweets at @ripienaar
• Volcane on IRC
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Why?
• Unit and Integration testing
• Cloud based scaling
• Maintenance windows and fast feedback
• Resource usage on the master
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Agent Life Cycle
• Agent gather facts using facter *
• Agent submit facts and request catalog
• Master compiles catalog, sends to agent *
• Agent stores catalog
• Agent applies catalog *
• Agent submits report
• Master processes report
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Facter
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Shows per fact timings
$ facter —timing
lsbdistid: 56.06ms
operatingsystem: 57.21ms
osfamily: 58.54ms
macaddress: 0.29ms
ipaddress6: 18.36ms
ipaddress6_lo: 31.41ms
mtu_dummy0: 29.82ms
vlans: 0.20ms
selinux: 11.91ms
mtu_ip_vti0: 29.09ms
Timing Facts
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Shows per fact timings…but only the setcode part
FREEGEOURL = “http://freegeoip.net/json/"
geoipinfo = JSON.parse(open(FREEGEOURL).read)
geoipinfo.each do |k, v|
next if k == "ip"
Facter.add("geo_#{k.downcase}") { setcode { v } }
end
Timing Facts
geo_latitude: 0.02ms
geo_region_name: 0.04ms
geo_metro_code: 0.04ms
geo_time_zone: 0.03ms
geo_country_code: 0.02ms
geo_country_name: 0.02ms
geo_zip_code: 0.02ms
geo_region_code: 0.04ms
geo_city: 0.04ms
geo_longitude: 0.03ms
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Restructuring fact to do the slow work in setcode
geoipinfo = nil
["country_code", “country_name”…].each do |key|
Facter.add(“geo_%s” % key.downcase) do
setcode do
geoipinfo ||= JSON.parse(open(FREEGEOURL).read)
["", nil].include?(geoipinfo[key]) ? "unknown" : geoipinfo[key]
end
end
end
Timing Facts
geo_zipcode: 7174.49ms
geo_metro_code: 0.04ms
geo_country_code: 0.03ms
geo_region_name: 0.04ms
geo_latitude: 0.05ms
geo_area_code: 0.04ms
geo_country_name: 0.03ms
geo_city: 0.04ms
geo_longitude: 0.04ms
geo_region_code: 0.04ms
Fetch once per run
and re-use
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Add a local cache, now only the first invoke is slow
def geoip_cached_fetch
store = PStore.new(File.join(Dir.tmpdir, “fgeoip_fact.pstore"))
store.transaction do
store[:freegeoip] ||= JSON.parse(open(FREEGEOURL).read)
end
end
geoipinfo = nil
["country_code", “country_name”…].each do |key|
Facter.add(“geo_%s” % key.downcase) do
setcode do
geoipinfo ||= geoip_cached_fetch
["", nil].include?(geoipinfo[key]) ? "unknown" : geoipinfo[key]
end
end
end
Timing Facts
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Catalog Compilation
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
class apache($version=present) {
validate_string($version)
class{“::apache::package”:
version => $version
}
}
Compilation
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
# /etc/puppet/modules/apache/init.pp
class apache($version=present) {
validate_string($version)
class{“::apache::package”:
version => $version
}
}
Compilation
Needs to find the file
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
class {'epel': } ->
class {'puppetdb': } ->
class {'puppet::master':
storeconfigs => true
}
Compilation
$ strace puppet parser validate
test.pp 2>&1 |grep stat|wc -l
10546
$ strace puppet parser validate
test.pp 2>&1 |egrep '((stat|open).
+modules)'|wc -l
217
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
# /etc/puppet/modules/apache/init.pp
class apache($version=present) {
validate_string($version)
class{“::apache::package”:
version => $version
}
}
Compilation
hiera(“apache::version”, “present”)
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
:hierarchy:
- 01_Nodes/%{::fqdn}
- 02_Domain/%{::domain}
- 03_Perimeter/%{::perimeter}/%{::datacenter}
- 03_Perimeter/%{::perimeter}
- 04_DC/%{::datacenter}
- 05_OS/%{::operatingsystem}/%{::hardwareisa}
- 05_OS/%{::operatingsystem}
- 06_Manufacturer/%{::manufacturer}
- 07_RealTime/%{::real_time}
- 09_Mco_Teams/%{::team}
- 50_Teams/%{team}/01_Nodes/%{::fqdn}
- 50_Teams/HPCE/%{::hpce_env}/%{::hpce_type}
- 50_Teams/HPCE/%{::hpce_env}/common
- 50_Teams/%{::team}/common
- common
Compilation
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
class {'epel': } ->
class {'puppetdb': } ->
class {'puppet::master':
storeconfigs => true
}
Compilation
$ puppet apply test.pp 2>&1|grep
"Looking for data source"|wc -l
3562
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
# /etc/puppet/modules/apache/init.pp
class apache($version=present) {
validate_string($version)
class{“::apache::package”:
version => $version
}
}
Compilation
ruby code, similar issues as the fact
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
# /etc/puppet/modules/apache/init.pp
class apache($version=present) {
validate_string($version)
class{“::apache::package”:
version => $version
}
}
Compilation
also speeds up finding
the class internally
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
# /etc/puppet/modules/apache/init.pp
class apache($version=present) {
validate_string($version)
class{“::apache::package”:
version => $version
}
}
Compilation
No hiera lookup,
authoritative value supplied
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
class {'epel': } ->
class {'puppetdb': } ->
class {'puppet::master':
storeconfigs => true
}
Profiling Compilation
$ puppet apply test.pp —profile
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
importing ‘..epel/manifests/init.pp’
importing ‘..epel/manifests/params.pp’
importing ‘..epel/manifests/rpm_gpg_key.pp’
importing ‘..puppetdb/manifests/init.pp’
importing ‘..puppetdb/manifests/params.pp’
PROFILE [apply] 2.3.1 Called defined: took 0.0001 seconds
PROFILE [apply] 2.3.2 Called downcase: took 0.0000 seconds
PROFILE [apply] 2.3.3 Called validate_re: took 0.0000 seconds
PROFILE [apply] 2.3.4 Called downcase: took 0.0000 seconds
PROFILE [apply] 2.3.5 Called validate_re: took 0.0000 seconds
PROFILE [apply] 2.3.6 Called downcase: took 0.0001 seconds
PROFILE [apply] 2.3.7 Called validate_re: took 0.0000 seconds
importing ‘..puppetdb/manifests/server.pp’ in environment production
PROFILE [apply] 2.3.8 Called downcase: took 0.0000 seconds
PROFILE [apply] 2.3.9 Called validate_re: took 0.0000 seconds
Profiling Compilation
class {'epel': } ->
class {'puppetdb': } ->
class {'puppet::master':
storeconfigs => true
}
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Scope(Apache::Vhost[default]): Retrieving template apache/
vhost.conf.erb
template[…vhost.conf.erb]: Bound template variables for …
vhost.conf.erb in 0.00 seconds
template[…vhost.conf.erb]: Interpolated template …vhost.conf.erb in
0.05 seconds
Profiling Compilation
define apache::vhost(…) {
file { “${priority_real}-${filename}.conf":
content => template(‘apache/vhost.conf.erb’)
}
}
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
AGGREGATE PROFILING RESULTS:
compiler -> compile: 5.800916 ms (1 calls)
compiler -> evaluate_resource: 1.53646 ms (79 calls)
compiler -> evaluate_resource -> Apache::Vhost[…]: 0.148923 ms
functions: 1.892293 ms (562 calls)
functions -> include: 1.091945 ms (41 calls)
functions -> template: 0.754388 ms (137 calls)
Profiling Compilation
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Catalog apply phase
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
# puppet agent —test —evaltrace
Class[Postgresql::Server::Reload]: Starting to evaluate
Class[Postgresql::Server::Reload]: Evaluated in 0.00 seconds
Class[Postgresql::Server::Config]: Starting to evaluate
Class[Postgresql::Server::Config]: Evaluated in 0.00 seconds
Class[Postgresql::Server::Service]: Starting to evaluate
Class[Postgresql::Server::Service]: Evaluated in 0.00 seconds
Apache::Vhost[puppet-localhost]: Starting to evaluate
Apache::Vhost[puppet-localhost]: Evaluated in 0.00 seconds
Package[mailcap]: Starting to evaluate
Package[mailcap]/ensure: created
Package[mailcap]: Evaluated in 65.36 seconds
Profiling the Agent
Tracing the catalog apply phase
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
# report_print.rb —count 5 —report 201411101110.yaml
Report for localhost at Wed Nov 10 11:10:54 +0000 2014
Report File: /var/…/last_run_report.yaml
Report Kind: apply
Puppet Version: 3.7.3
Report Format: 4
Configuration Version: 1416395447
UUID: d4a9fac9-…-7db61b0dfa89
Log Lines: 2 (show with —log)
Profiling the Agent
Processing reports for performance metrics
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Report Metrics:
Changes:
Total: 2
Events:
Total: 2
Success: 2
Failure: 0
Resources:
Total: 213
Out of sync: 2
Changed: 2
Scheduled: 0
Skipped: 0
Failed to restart: 0
Failed: 0
Restarted: 0
Profiling the Agent
Processing reports for performance metrics
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Time:
Total: 28.44
Package: 15.55
Config retrieval: 7.71
File: 1.43
Exec: 1.33
Puppetdb conn validator: 0.87
Service: 0.73
Postgresql psql: 0.66
Augeas: 0.07
Ini setting: 0.04
Profiling the Agent
Processing reports for performance metrics
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Resources by resource type:
107 File
38 Ini_setting
13 Exec
12 Postgresql_psql
9 Package
6 Yumrepo
6 Anchor
6 Schedule
4 Service
3 Postgresql_conf
Profiling the Agent
Processing reports for performance metrics
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Slowest 5 resources by evaluation time:
15.55 Package[mailcap]
0.88 Puppetdb_conn_validator[puppetdb_conn]
0.66 File[/usr…/validate_postgresql_connection.sh]
0.31 Exec[validate postgres connection]
0.30 Service[puppetmaster]
Profiling the Agent
Processing reports for performance metrics
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
5 largest managed files (only those that are readable)
3.85 KB /var/…/bin/concatfragments.sh
1.65 KB /etc/puppet/rack/config.ru
1.61 KB /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
1.23 KB /etc/puppet/puppet.conf
849.00 B /etc/httpd/conf/httpd.conf
Profiling the Agent
Processing reports for performance metrics
R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar
Questions?
twitter: @ripienaar
email: rip@devco.net
blog: www.devco.net
github: ripienaar
freenode: Volcane
geo fact: http://srt.ly/hx
report processor: http://srt.ly/gq

Contenu connexe

Tendances

Actor Clustering with Docker Containers and Akka.Net in F#
Actor Clustering with Docker Containers and Akka.Net in F#Actor Clustering with Docker Containers and Akka.Net in F#
Actor Clustering with Docker Containers and Akka.Net in F#Riccardo Terrell
 
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2Chef
 
Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3Chef
 
Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4Chef
 
Community Cookbooks & further resources - Fundamentals Webinar Series Part 6
Community Cookbooks & further resources - Fundamentals Webinar Series Part 6Community Cookbooks & further resources - Fundamentals Webinar Series Part 6
Community Cookbooks & further resources - Fundamentals Webinar Series Part 6Chef
 
Autoscaling with hashi_corp_nomad
Autoscaling with hashi_corp_nomadAutoscaling with hashi_corp_nomad
Autoscaling with hashi_corp_nomadBram Vogelaar
 
Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)Ivan Rossi
 
Environments - Fundamentals Webinar Series Week 5
Environments - Fundamentals Webinar Series Week 5Environments - Fundamentals Webinar Series Week 5
Environments - Fundamentals Webinar Series Week 5Chef
 
What\'s new in Rails 2.1
What\'s new in Rails 2.1What\'s new in Rails 2.1
What\'s new in Rails 2.1Keith Pitty
 
Hacking ansible
Hacking ansibleHacking ansible
Hacking ansiblebcoca
 
Ruby on Rails - Introduction
Ruby on Rails - IntroductionRuby on Rails - Introduction
Ruby on Rails - IntroductionVagmi Mudumbai
 
把鐵路開進視窗裡
把鐵路開進視窗裡把鐵路開進視窗裡
把鐵路開進視窗裡Wei Jen Lu
 
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpecTest-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpecMartin Etmajer
 
Automating Infrastructure with Chef
Automating Infrastructure with ChefAutomating Infrastructure with Chef
Automating Infrastructure with ChefJennifer Davis
 
Composer for busy developers - DPC13
Composer for busy developers - DPC13Composer for busy developers - DPC13
Composer for busy developers - DPC13Rafael Dohms
 
Writing Ansible Modules (DENOG11)
Writing Ansible Modules (DENOG11)Writing Ansible Modules (DENOG11)
Writing Ansible Modules (DENOG11)Martin Schütte
 

Tendances (20)

Getting Started With Aura
Getting Started With AuraGetting Started With Aura
Getting Started With Aura
 
Actor Clustering with Docker Containers and Akka.Net in F#
Actor Clustering with Docker Containers and Akka.Net in F#Actor Clustering with Docker Containers and Akka.Net in F#
Actor Clustering with Docker Containers and Akka.Net in F#
 
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
 
Refactoring terraform
Refactoring terraformRefactoring terraform
Refactoring terraform
 
Refactoring Infrastructure Code
Refactoring Infrastructure CodeRefactoring Infrastructure Code
Refactoring Infrastructure Code
 
Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3
 
Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4
 
Community Cookbooks & further resources - Fundamentals Webinar Series Part 6
Community Cookbooks & further resources - Fundamentals Webinar Series Part 6Community Cookbooks & further resources - Fundamentals Webinar Series Part 6
Community Cookbooks & further resources - Fundamentals Webinar Series Part 6
 
Autoscaling with hashi_corp_nomad
Autoscaling with hashi_corp_nomadAutoscaling with hashi_corp_nomad
Autoscaling with hashi_corp_nomad
 
Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)
 
Environments - Fundamentals Webinar Series Week 5
Environments - Fundamentals Webinar Series Week 5Environments - Fundamentals Webinar Series Week 5
Environments - Fundamentals Webinar Series Week 5
 
What\'s new in Rails 2.1
What\'s new in Rails 2.1What\'s new in Rails 2.1
What\'s new in Rails 2.1
 
Reduxing like a pro
Reduxing like a proReduxing like a pro
Reduxing like a pro
 
Hacking ansible
Hacking ansibleHacking ansible
Hacking ansible
 
Ruby on Rails - Introduction
Ruby on Rails - IntroductionRuby on Rails - Introduction
Ruby on Rails - Introduction
 
把鐵路開進視窗裡
把鐵路開進視窗裡把鐵路開進視窗裡
把鐵路開進視窗裡
 
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpecTest-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
 
Automating Infrastructure with Chef
Automating Infrastructure with ChefAutomating Infrastructure with Chef
Automating Infrastructure with Chef
 
Composer for busy developers - DPC13
Composer for busy developers - DPC13Composer for busy developers - DPC13
Composer for busy developers - DPC13
 
Writing Ansible Modules (DENOG11)
Writing Ansible Modules (DENOG11)Writing Ansible Modules (DENOG11)
Writing Ansible Modules (DENOG11)
 

Similaire à Puppet Performance Profiling - CM Camp 2015

Large Scale Continuous Delivery
Large Scale Continuous DeliveryLarge Scale Continuous Delivery
Large Scale Continuous Deliveryripienaar
 
Introduction to MCollective - SF PUG
Introduction to MCollective - SF PUGIntroduction to MCollective - SF PUG
Introduction to MCollective - SF PUGPuppet
 
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014Puppet
 
R.I. Pienaar - Puppet Camp 2010
R.I. Pienaar - Puppet Camp 2010R.I. Pienaar - Puppet Camp 2010
R.I. Pienaar - Puppet Camp 2010Puppet
 
Background Jobs with Resque
Background Jobs with ResqueBackground Jobs with Resque
Background Jobs with Resquehomanj
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php PresentationAlan Pinstein
 
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Masahiro Nagano
 
Python from zero to hero (Twitter Explorer)
Python from zero to hero (Twitter Explorer)Python from zero to hero (Twitter Explorer)
Python from zero to hero (Twitter Explorer)Yuriy Senko
 
OpenStack API's and WSGI
OpenStack API's and WSGIOpenStack API's and WSGI
OpenStack API's and WSGIMike Pittaro
 
Pyramid Deployment and Maintenance
Pyramid Deployment and MaintenancePyramid Deployment and Maintenance
Pyramid Deployment and MaintenanceJazkarta, Inc.
 
Django Introduction & Tutorial
Django Introduction & TutorialDjango Introduction & Tutorial
Django Introduction & Tutorial之宇 趙
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5Darren Craig
 
Introduction to Configuration Management
Introduction to Configuration ManagementIntroduction to Configuration Management
Introduction to Configuration Managementripienaar
 
2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Herokuronnywang_tw
 
Let's build Developer Portal with Backstage
Let's build Developer Portal with BackstageLet's build Developer Portal with Backstage
Let's build Developer Portal with BackstageOpsta
 
PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar
PuppetConf. 2016: External Data in Puppet 4 – R.I. PienaarPuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar
PuppetConf. 2016: External Data in Puppet 4 – R.I. PienaarPuppet
 
OSMC 2009 | Icinga by Icinga Team
OSMC 2009 | Icinga by Icinga TeamOSMC 2009 | Icinga by Icinga Team
OSMC 2009 | Icinga by Icinga TeamNETWAYS
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastWorkshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastMichelangelo van Dam
 

Similaire à Puppet Performance Profiling - CM Camp 2015 (20)

Large Scale Continuous Delivery
Large Scale Continuous DeliveryLarge Scale Continuous Delivery
Large Scale Continuous Delivery
 
Introduction to MCollective - SF PUG
Introduction to MCollective - SF PUGIntroduction to MCollective - SF PUG
Introduction to MCollective - SF PUG
 
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
 
R.I. Pienaar - Puppet Camp 2010
R.I. Pienaar - Puppet Camp 2010R.I. Pienaar - Puppet Camp 2010
R.I. Pienaar - Puppet Camp 2010
 
Background Jobs with Resque
Background Jobs with ResqueBackground Jobs with Resque
Background Jobs with Resque
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php Presentation
 
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015
 
Python from zero to hero (Twitter Explorer)
Python from zero to hero (Twitter Explorer)Python from zero to hero (Twitter Explorer)
Python from zero to hero (Twitter Explorer)
 
OpenStack API's and WSGI
OpenStack API's and WSGIOpenStack API's and WSGI
OpenStack API's and WSGI
 
Nginx3
Nginx3Nginx3
Nginx3
 
Pyramid Deployment and Maintenance
Pyramid Deployment and MaintenancePyramid Deployment and Maintenance
Pyramid Deployment and Maintenance
 
What's Rio 〜Standalone〜
What's Rio 〜Standalone〜What's Rio 〜Standalone〜
What's Rio 〜Standalone〜
 
Django Introduction & Tutorial
Django Introduction & TutorialDjango Introduction & Tutorial
Django Introduction & Tutorial
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5
 
Introduction to Configuration Management
Introduction to Configuration ManagementIntroduction to Configuration Management
Introduction to Configuration Management
 
2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku
 
Let's build Developer Portal with Backstage
Let's build Developer Portal with BackstageLet's build Developer Portal with Backstage
Let's build Developer Portal with Backstage
 
PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar
PuppetConf. 2016: External Data in Puppet 4 – R.I. PienaarPuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar
PuppetConf. 2016: External Data in Puppet 4 – R.I. Pienaar
 
OSMC 2009 | Icinga by Icinga Team
OSMC 2009 | Icinga by Icinga TeamOSMC 2009 | Icinga by Icinga Team
OSMC 2009 | Icinga by Icinga Team
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastWorkshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfast
 

Dernier

The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxRTS corp
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 
eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolsosttopstonverter
 
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full RecordingOpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full RecordingShane Coughlan
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxAndreas Kunz
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsSafe Software
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...OnePlan Solutions
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slidesvaideheekore1
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonApplitools
 
Effectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorEffectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorTier1 app
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogueitservices996
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldRoberto Pérez Alcolea
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITmanoharjgpsolutions
 
Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLionel Briand
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptxVinzoCenzo
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?Alexandre Beguel
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shardsChristopher Curtin
 

Dernier (20)

The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 
eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration tools
 
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full RecordingOpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data Streams
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slides
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
 
Effectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorEffectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryError
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogue
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh IT
 
Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and Repair
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptx
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards
 

Puppet Performance Profiling - CM Camp 2015

  • 2. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Who am I? • Puppet user since 0.22.x • Blog at http://devco.net • Tweets at @ripienaar • Volcane on IRC
  • 3. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Why? • Unit and Integration testing • Cloud based scaling • Maintenance windows and fast feedback • Resource usage on the master
  • 4. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Agent Life Cycle • Agent gather facts using facter * • Agent submit facts and request catalog • Master compiles catalog, sends to agent * • Agent stores catalog • Agent applies catalog * • Agent submits report • Master processes report
  • 5. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Facter
  • 6. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Shows per fact timings $ facter —timing lsbdistid: 56.06ms operatingsystem: 57.21ms osfamily: 58.54ms macaddress: 0.29ms ipaddress6: 18.36ms ipaddress6_lo: 31.41ms mtu_dummy0: 29.82ms vlans: 0.20ms selinux: 11.91ms mtu_ip_vti0: 29.09ms Timing Facts
  • 7. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Shows per fact timings…but only the setcode part FREEGEOURL = “http://freegeoip.net/json/" geoipinfo = JSON.parse(open(FREEGEOURL).read) geoipinfo.each do |k, v| next if k == "ip" Facter.add("geo_#{k.downcase}") { setcode { v } } end Timing Facts geo_latitude: 0.02ms geo_region_name: 0.04ms geo_metro_code: 0.04ms geo_time_zone: 0.03ms geo_country_code: 0.02ms geo_country_name: 0.02ms geo_zip_code: 0.02ms geo_region_code: 0.04ms geo_city: 0.04ms geo_longitude: 0.03ms
  • 8. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Restructuring fact to do the slow work in setcode geoipinfo = nil ["country_code", “country_name”…].each do |key| Facter.add(“geo_%s” % key.downcase) do setcode do geoipinfo ||= JSON.parse(open(FREEGEOURL).read) ["", nil].include?(geoipinfo[key]) ? "unknown" : geoipinfo[key] end end end Timing Facts geo_zipcode: 7174.49ms geo_metro_code: 0.04ms geo_country_code: 0.03ms geo_region_name: 0.04ms geo_latitude: 0.05ms geo_area_code: 0.04ms geo_country_name: 0.03ms geo_city: 0.04ms geo_longitude: 0.04ms geo_region_code: 0.04ms Fetch once per run and re-use
  • 9. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Add a local cache, now only the first invoke is slow def geoip_cached_fetch store = PStore.new(File.join(Dir.tmpdir, “fgeoip_fact.pstore")) store.transaction do store[:freegeoip] ||= JSON.parse(open(FREEGEOURL).read) end end geoipinfo = nil ["country_code", “country_name”…].each do |key| Facter.add(“geo_%s” % key.downcase) do setcode do geoipinfo ||= geoip_cached_fetch ["", nil].include?(geoipinfo[key]) ? "unknown" : geoipinfo[key] end end end Timing Facts
  • 10. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Catalog Compilation
  • 11. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar class apache($version=present) { validate_string($version) class{“::apache::package”: version => $version } } Compilation
  • 12. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar # /etc/puppet/modules/apache/init.pp class apache($version=present) { validate_string($version) class{“::apache::package”: version => $version } } Compilation Needs to find the file
  • 13. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar class {'epel': } -> class {'puppetdb': } -> class {'puppet::master': storeconfigs => true } Compilation $ strace puppet parser validate test.pp 2>&1 |grep stat|wc -l 10546 $ strace puppet parser validate test.pp 2>&1 |egrep '((stat|open). +modules)'|wc -l 217
  • 14. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar # /etc/puppet/modules/apache/init.pp class apache($version=present) { validate_string($version) class{“::apache::package”: version => $version } } Compilation hiera(“apache::version”, “present”)
  • 15. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar :hierarchy: - 01_Nodes/%{::fqdn} - 02_Domain/%{::domain} - 03_Perimeter/%{::perimeter}/%{::datacenter} - 03_Perimeter/%{::perimeter} - 04_DC/%{::datacenter} - 05_OS/%{::operatingsystem}/%{::hardwareisa} - 05_OS/%{::operatingsystem} - 06_Manufacturer/%{::manufacturer} - 07_RealTime/%{::real_time} - 09_Mco_Teams/%{::team} - 50_Teams/%{team}/01_Nodes/%{::fqdn} - 50_Teams/HPCE/%{::hpce_env}/%{::hpce_type} - 50_Teams/HPCE/%{::hpce_env}/common - 50_Teams/%{::team}/common - common Compilation
  • 16. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar class {'epel': } -> class {'puppetdb': } -> class {'puppet::master': storeconfigs => true } Compilation $ puppet apply test.pp 2>&1|grep "Looking for data source"|wc -l 3562
  • 17. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar # /etc/puppet/modules/apache/init.pp class apache($version=present) { validate_string($version) class{“::apache::package”: version => $version } } Compilation ruby code, similar issues as the fact
  • 18. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar # /etc/puppet/modules/apache/init.pp class apache($version=present) { validate_string($version) class{“::apache::package”: version => $version } } Compilation also speeds up finding the class internally
  • 19. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar # /etc/puppet/modules/apache/init.pp class apache($version=present) { validate_string($version) class{“::apache::package”: version => $version } } Compilation No hiera lookup, authoritative value supplied
  • 20. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar class {'epel': } -> class {'puppetdb': } -> class {'puppet::master': storeconfigs => true } Profiling Compilation $ puppet apply test.pp —profile
  • 21. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar importing ‘..epel/manifests/init.pp’ importing ‘..epel/manifests/params.pp’ importing ‘..epel/manifests/rpm_gpg_key.pp’ importing ‘..puppetdb/manifests/init.pp’ importing ‘..puppetdb/manifests/params.pp’ PROFILE [apply] 2.3.1 Called defined: took 0.0001 seconds PROFILE [apply] 2.3.2 Called downcase: took 0.0000 seconds PROFILE [apply] 2.3.3 Called validate_re: took 0.0000 seconds PROFILE [apply] 2.3.4 Called downcase: took 0.0000 seconds PROFILE [apply] 2.3.5 Called validate_re: took 0.0000 seconds PROFILE [apply] 2.3.6 Called downcase: took 0.0001 seconds PROFILE [apply] 2.3.7 Called validate_re: took 0.0000 seconds importing ‘..puppetdb/manifests/server.pp’ in environment production PROFILE [apply] 2.3.8 Called downcase: took 0.0000 seconds PROFILE [apply] 2.3.9 Called validate_re: took 0.0000 seconds Profiling Compilation class {'epel': } -> class {'puppetdb': } -> class {'puppet::master': storeconfigs => true }
  • 22. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Scope(Apache::Vhost[default]): Retrieving template apache/ vhost.conf.erb template[…vhost.conf.erb]: Bound template variables for … vhost.conf.erb in 0.00 seconds template[…vhost.conf.erb]: Interpolated template …vhost.conf.erb in 0.05 seconds Profiling Compilation define apache::vhost(…) { file { “${priority_real}-${filename}.conf": content => template(‘apache/vhost.conf.erb’) } }
  • 23. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar AGGREGATE PROFILING RESULTS: compiler -> compile: 5.800916 ms (1 calls) compiler -> evaluate_resource: 1.53646 ms (79 calls) compiler -> evaluate_resource -> Apache::Vhost[…]: 0.148923 ms functions: 1.892293 ms (562 calls) functions -> include: 1.091945 ms (41 calls) functions -> template: 0.754388 ms (137 calls) Profiling Compilation
  • 24. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Catalog apply phase
  • 25. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar # puppet agent —test —evaltrace Class[Postgresql::Server::Reload]: Starting to evaluate Class[Postgresql::Server::Reload]: Evaluated in 0.00 seconds Class[Postgresql::Server::Config]: Starting to evaluate Class[Postgresql::Server::Config]: Evaluated in 0.00 seconds Class[Postgresql::Server::Service]: Starting to evaluate Class[Postgresql::Server::Service]: Evaluated in 0.00 seconds Apache::Vhost[puppet-localhost]: Starting to evaluate Apache::Vhost[puppet-localhost]: Evaluated in 0.00 seconds Package[mailcap]: Starting to evaluate Package[mailcap]/ensure: created Package[mailcap]: Evaluated in 65.36 seconds Profiling the Agent Tracing the catalog apply phase
  • 26. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar # report_print.rb —count 5 —report 201411101110.yaml Report for localhost at Wed Nov 10 11:10:54 +0000 2014 Report File: /var/…/last_run_report.yaml Report Kind: apply Puppet Version: 3.7.3 Report Format: 4 Configuration Version: 1416395447 UUID: d4a9fac9-…-7db61b0dfa89 Log Lines: 2 (show with —log) Profiling the Agent Processing reports for performance metrics
  • 27. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Report Metrics: Changes: Total: 2 Events: Total: 2 Success: 2 Failure: 0 Resources: Total: 213 Out of sync: 2 Changed: 2 Scheduled: 0 Skipped: 0 Failed to restart: 0 Failed: 0 Restarted: 0 Profiling the Agent Processing reports for performance metrics
  • 28. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Time: Total: 28.44 Package: 15.55 Config retrieval: 7.71 File: 1.43 Exec: 1.33 Puppetdb conn validator: 0.87 Service: 0.73 Postgresql psql: 0.66 Augeas: 0.07 Ini setting: 0.04 Profiling the Agent Processing reports for performance metrics
  • 29. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Resources by resource type: 107 File 38 Ini_setting 13 Exec 12 Postgresql_psql 9 Package 6 Yumrepo 6 Anchor 6 Schedule 4 Service 3 Postgresql_conf Profiling the Agent Processing reports for performance metrics
  • 30. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Slowest 5 resources by evaluation time: 15.55 Package[mailcap] 0.88 Puppetdb_conn_validator[puppetdb_conn] 0.66 File[/usr…/validate_postgresql_connection.sh] 0.31 Exec[validate postgres connection] 0.30 Service[puppetmaster] Profiling the Agent Processing reports for performance metrics
  • 31. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar 5 largest managed files (only those that are readable) 3.85 KB /var/…/bin/concatfragments.sh 1.65 KB /etc/puppet/rack/config.ru 1.61 KB /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 1.23 KB /etc/puppet/puppet.conf 849.00 B /etc/httpd/conf/httpd.conf Profiling the Agent Processing reports for performance metrics
  • 32. R.I.Pienaar | rip@devco.net | http://devco.net | @ripienaar Questions? twitter: @ripienaar email: rip@devco.net blog: www.devco.net github: ripienaar freenode: Volcane geo fact: http://srt.ly/hx report processor: http://srt.ly/gq