SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Bo#om	
  to	
  Top	
  Stack	
  
   Op.miza.on	
  
 With	
  LAMP	
  +	
  CodeIgniter	
  
Server	
  side:	
  It’s	
  About	
  I/O	
  
             Network	
  I/O	
  
               Disk	
  I/O	
  
                   CPU	
  
Server/Client	
  side:	
  	
  
Minimize	
  and	
  Cache	
  Assets	
  
Op.miza.on	
  Roadmap	
  
•    System	
  
•    MySQL	
  
•    Apache	
  
•    PHP	
  
•    Framework	
  
•    Applica.on	
  
Tes.ng	
  
•  Frontend	
  
   –  Yslow	
  
•  Backend	
  
   –  `ab`	
  
   –  vmstat	
  
LAMP	
  Configura.on	
  
•  By	
  default,	
  for	
  “compa.bility”	
  
•  You’re	
  responsible	
  for	
  your	
  boxes	
  
System	
  
•  Don’t	
  swap	
  
    –  Swap	
  in	
  itself	
  isn’t	
  bad,	
  swapping	
  out	
  is	
  
•  Get	
  rid	
  of	
  non-­‐essen.al	
  processes	
  
•  a.me	
  –	
  Filesystem	
  op.on	
  to	
  write	
  ‘last-­‐
   accessed’	
  .me	
  to	
  everything	
  
    $	
  cat	
  /	
  
•  If	
  you’re	
  a	
  badass,	
  check	
  into	
  XFS	
  
a.me	
  
$ cat /etc/fstab
proc             /proc   proc    defaults    0 0
/dev/sda1        /       ext3    defaults,errors=remount-ro,noatime   0 1
/dev/sda2        none    swap    sw          0 0
MySQL	
  
•  Don’t	
  “SELECT	
  *”	
  
      –  If	
  the	
  data	
  you	
  need	
  is	
  in	
  an	
  index,	
  MySQL	
  will	
  grab	
  that	
  
•  Column	
  indexes	
  
      –  Foreign	
  key	
  type	
  matching	
  
      –  Be	
  smart	
  about	
  column	
  size	
  
      –  Integrity	
  checks?	
  Try	
  NOT	
  dele.ng	
  instead	
  
•    Batched	
  queries	
  
•    Key	
  Buffer	
  
•    Query	
  Buffer	
  
•    Engine	
  
      –  InnoDB,	
  or	
  go	
  crazy	
  and	
  use	
  Percona	
  XtraDB	
  with	
  XFS	
  
Apache	
  
•    Kill	
  unneeded	
  modules	
  
•    Tune	
  MaxClients	
  
•    Eliminate	
  .htaccess,	
  if	
  possible	
  
•    Kill	
  access	
  logs	
  
•    Disable	
  ETags	
  if	
  not	
  used	
  
•    Expires	
  Headers	
  
•    Compression	
  
•    Don’t	
  serve	
  sta.c	
  content	
  (if	
  you	
  can	
  avoid	
  it)	
  
Benchmarking	
  
•  Apache	
  bench	
  is	
  most	
  common	
  
              –  Tests	
  Requests	
  Per	
  Second	
  
•  Use	
  vmstat	
  to	
  watch	
  swap	
  usage	
  
•  Send	
  1,000	
  requests,	
  concurrency	
  of	
  10	
  
              	
  
	
  	
  	
  	
  $    ab –n 1000 –c 10 http://getsparks.org
Finished	
  10000	
  requests	
  
	
  
Server	
  Soiware:	
  	
  	
  	
  	
  	
  	
  	
  Apache/2.2.12	
  
Server	
  Hostname:	
  	
  	
  	
  	
  	
  	
  	
  getsparks.org	
  
Server	
  Port:	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  80	
  
	
  
Document	
  Path:	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  /	
  
Document	
  Length:	
  	
  	
  	
  	
  	
  	
  	
  9865	
  bytes	
  
	
  
Concurrency	
  Level:	
  	
  	
  	
  	
  	
  10	
  
Time	
  taken	
  for	
  tests:	
  	
  	
  6.040	
  seconds	
  
Complete	
  requests:	
  	
  	
  	
  	
  	
  10000	
  
…	
  
Requests	
  per	
  second:	
  	
  	
  	
  1655.63	
  [#/sec]	
  (mean)	
  
Time	
  per	
  request:	
  	
  	
  	
  	
  	
  	
  6.040	
  [ms]	
  (mean)	
  
Time	
  per	
  request:	
  	
  	
  	
  	
  	
  	
  0.604	
  [ms]	
  (mean,	
  across	
  all	
  concurrent	
  requests)	
  
Transfer	
  rate:	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  16260.41	
  [Kbytes/sec]	
  received	
  
	
  
Percentage	
  of	
  the	
  requests	
  served	
  within	
  a	
  certain	
  .me	
  (ms)	
  
	
  	
  50%	
  	
  	
  	
  	
  10	
  
	
  	
  …	
  
100%	
  	
  	
  	
  	
  60	
  (longest	
  request)	
  
$ vmstat 5

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r b    swpd   free   buff cache    si   so    bi    bo   in   cs us sy id wa
 0 0 55152 53212 15128 69172         0    0     0     1    0    1 0 0 100 0
 1 0 55152 54428 15132 69172         0    0     0    20   56   48 0 0 100 0
Killing	
  Apache	
  Modules	
  
$ a2dismod
Your choices are: alias auth_basic
authn_file authz_default authz_groupfile
authz_host authz_user autoindex cgi deflate
dir env expires mime negotiation php5
rewrite setenvif status
Tuning	
  MaxClients	
  
“You	
  can,	
  and	
  should,	
  control	
  the	
  MaxClients	
  se5ng	
  so	
  that	
  your	
  server	
  does	
  
not	
  spawn	
  so	
  many	
  children	
  it	
  starts	
  swapping.”	
  
       	
   	
    	
     	
     	
   	
         	
   	
     	
   	
   	
  -­‐	
  Apache.org	
  
	
  
Usually	
  in	
  h#pd.conf	
  or	
  apache2.conf	
  
	
  
Find	
  average	
  size	
  of	
  h#p	
  process	
  with	
  `top`	
  (x).	
  
How	
  much	
  RAM	
  to	
  dedicate	
  to	
  Apache?	
  (n).	
  
	
  
MaxClients	
  =	
  floor(n	
  /	
  x)	
  
	
  
Play	
  around	
  with	
  that	
  and	
  Apache	
  Bench	
  `ab`	
  
Adding	
  Expires	
  Headers	
  
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "access plus X days"
ExpiresByType image/jpeg "access plus X days"
ExpiresByType image/png "access plus X days"
ExpiresByType text/css "access plus X days"
ExpiresByType text/js "access plus X days"
ExpiresByType text/javascript "access plus X days"
ExpiresByType application/javascript "access plus X
days"
ExpiresByType application/x-javascript "access plus
X days"
ExpiresDefault "access plus X days"
</IfModule>
mod_deflate	
  
•  Compress	
  your	
  stuff,	
  comes	
  with	
  Apache	
  

$ a2enmod deflate
# … configure in global or vhost config …
AddOutputFilterByType DEFLATE text/html text/plain text/xml
# … restart Apache
$ apache2ctl -k restart
Killing	
  ETags	
  
$	
  a2enmod	
  header	
  
#	
  open	
  apache.conf	
  or	
  h#pd.conf,	
  add:	
  
Header	
  unset	
  ETag	
  
FileETag	
  None	
  
$	
  apache2ctl	
  –k	
  restart	
  
	
  
HTTP	
  Accelerators	
  
•  Serving	
  sta.c	
  content	
  is	
  VERY	
  expensive	
  for	
  
   Apache	
  
•  Varnish,	
  Squid	
  

$	
  apt-­‐get	
  install	
  varnish	
  
#	
  go	
  to	
  varnish-­‐cache.org	
  
PHP	
  
•  APC	
  
    –  Caches	
  PHP	
  Op-­‐code,	
  can	
  use	
  as	
  cache	
  
    –  Faster	
  than	
  memcache	
  for	
  one	
  box	
  
•  PHP	
  5.3	
  
•  mysqlnd	
  	
  
•  Output	
  buffering	
  tuning,	
  send	
  data	
  to	
  client	
  
   more	
  frequently	
  
APC	
  Install	
  
$	
  apt-­‐get	
  install	
  php-­‐pear	
  
…	
  
$	
  pecl	
  install	
  apc	
  
	
  
	
  
Then	
  take	
  a	
  look	
  at	
  cache	
  size:	
  apc.shm_size	
  
Framework	
  (CodeIgniter)	
  
•  Page	
  Caching	
  
   –  Personalized	
  info,	
  uh	
  oh.	
  
•  Query	
  Result	
  Caching	
  
•  Configura.on	
  
   –  Disable	
  verbose	
  logging	
  
   –  Output	
  compression	
  
   –  config/database.php:	
  autoinit?	
  
•  Minifying,	
  combining	
  assets	
  
   –  ‘assets’	
  Spark	
  
Applica.on	
  
•    Most	
  op.miza.on	
  does	
  not	
  occur	
  within	
  code	
  
•    Use	
  built-­‐in	
  PHP	
  func.ons	
  
•    Use	
  associa.ve	
  arrays	
  (hashes,	
  dic.onaries)	
  
•    Batch	
  DB	
  Inserts,	
  Selects	
  
•    Don’t	
  use	
  references	
  unless	
  it	
  makes	
  sense	
  
     –  Like…	
  $CI	
  =	
  &	
  get_instance();	
  
•  require_once	
  is	
  expensive	
  
•  count()	
  elements	
  before	
  start	
  ‘for’	
  loop	
  
Applica.on	
  (cont’d)	
  
•  Don’t	
  copy	
  variables	
  if	
  you	
  don’t	
  have	
  to	
  
        	
  foreach($db_result	
  as	
  $row)	
  {	
  
        	
   	
  $content	
  =	
  $row[‘content’];	
  
        	
   	
  $content	
  =	
  word_limited($content,	
  100);	
  
        	
  }	
  
    	
  
    And	
  the	
  usual:	
  require_once,	
  etc.	
  
Find	
  one	
  or	
  two	
  numbers	
  in	
  an	
  array	
  that	
  add	
  to	
  10.	
  
	
  
The	
  gross	
  way	
  —	
  n2	
  
	
  
$set	
  =	
  array(1,	
  6,	
  7,	
  2,	
  5,	
  0,	
  8);	
  
	
  
foreach($set	
  as	
  $a)	
  {	
  
      	
  foreach($set	
  as	
  $b)	
  {	
  
      	
   	
  if($a	
  +	
  $b	
  ==	
  10)	
  
      	
   	
   	
  exit(“Found	
  $a	
  and	
  $b”);	
  
      	
  }	
  
}	
  
	
  
	
  
Find	
  one	
  or	
  two	
  numbers	
  in	
  an	
  array	
  that	
  add	
  to	
  10.	
  
	
  
The	
  real	
  way	
  —	
  n	
  
	
  
$set	
  =	
  array(1,	
  6,	
  7,	
  2,	
  5,	
  0,	
  8);	
  
$flipped	
  =	
  array_flip($a);	
  
	
  
foreach($set	
  as	
  $el)	
  {	
  
      	
  $needed	
  =	
  10	
  -­‐	
  $el;	
  
      	
  if(array_key_exists($needed,	
  $flipped))	
  
      	
   	
  exit(“Found	
  $el	
  and	
  $needed”);	
  
}	
  
	
  
	
  
When	
  You	
  Get	
  Big	
  
•  More	
  machines!	
  with	
  load	
  balancing	
  
•  memcached	
  
•  Master-­‐slave	
  db	
  setup	
  
   –  Writes	
  to	
  master,	
  reads	
  to	
  slave	
  
Takeaways	
  
•  GetSpark’s	
  APC-­‐based	
  Output	
  override	
  
•  These	
  slides	
  


          	
  	
  	
  	
  codefury.net/cicon2011	
  

                   Kenny	
  Katzgrau	
  
                    	
  @_kennyk_	
  
	
  

Contenu connexe

Tendances

AnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time webAnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time web
clkao
 
Lightweight wrapper for Hive on Amazon EMR
Lightweight wrapper for Hive on Amazon EMRLightweight wrapper for Hive on Amazon EMR
Lightweight wrapper for Hive on Amazon EMR
Shinji Tanaka
 

Tendances (20)

A reviravolta do desenvolvimento web
A reviravolta do desenvolvimento webA reviravolta do desenvolvimento web
A reviravolta do desenvolvimento web
 
AnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time webAnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time web
 
Nuvola: a tale of migration to AWS
Nuvola: a tale of migration to AWSNuvola: a tale of migration to AWS
Nuvola: a tale of migration to AWS
 
Php on Windows
Php on WindowsPhp on Windows
Php on Windows
 
Memcached
MemcachedMemcached
Memcached
 
Declarative & workflow based infrastructure with Terraform
Declarative & workflow based infrastructure with TerraformDeclarative & workflow based infrastructure with Terraform
Declarative & workflow based infrastructure with Terraform
 
More tips n tricks
More tips n tricksMore tips n tricks
More tips n tricks
 
Terraform at Scale - All Day DevOps 2017
Terraform at Scale - All Day DevOps 2017Terraform at Scale - All Day DevOps 2017
Terraform at Scale - All Day DevOps 2017
 
About Data::ObjectDriver
About Data::ObjectDriverAbout Data::ObjectDriver
About Data::ObjectDriver
 
Modern Perl
Modern PerlModern Perl
Modern Perl
 
A Hands-on Introduction on Terraform Best Concepts and Best Practices
A Hands-on Introduction on Terraform Best Concepts and Best Practices A Hands-on Introduction on Terraform Best Concepts and Best Practices
A Hands-on Introduction on Terraform Best Concepts and Best Practices
 
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
 
[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화
 
Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018
 
Ansible Meetup Hamburg / Quickstart
Ansible Meetup Hamburg / QuickstartAnsible Meetup Hamburg / Quickstart
Ansible Meetup Hamburg / Quickstart
 
Follow the White Rabbit - Message Queues with PHP
Follow the White Rabbit - Message Queues with PHPFollow the White Rabbit - Message Queues with PHP
Follow the White Rabbit - Message Queues with PHP
 
Php on the desktop and php gtk2
Php on the desktop and php gtk2Php on the desktop and php gtk2
Php on the desktop and php gtk2
 
Lightweight wrapper for Hive on Amazon EMR
Lightweight wrapper for Hive on Amazon EMRLightweight wrapper for Hive on Amazon EMR
Lightweight wrapper for Hive on Amazon EMR
 
Northeast PHP - High Performance PHP
Northeast PHP - High Performance PHPNortheast PHP - High Performance PHP
Northeast PHP - High Performance PHP
 
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
 

Similaire à Bottom to Top Stack Optimization - CICON2011

4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook
guoqing75
 
20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag
garrett honeycutt
 
Cassandra
CassandraCassandra
Cassandra
exsuns
 

Similaire à Bottom to Top Stack Optimization - CICON2011 (20)

Top ten-list
Top ten-listTop ten-list
Top ten-list
 
Caching with Memcached and APC
Caching with Memcached and APCCaching with Memcached and APC
Caching with Memcached and APC
 
Learning Puppet basic thing
Learning Puppet basic thing Learning Puppet basic thing
Learning Puppet basic thing
 
PHP & Performance
PHP & PerformancePHP & Performance
PHP & Performance
 
php & performance
 php & performance php & performance
php & performance
 
Introduction to memcached
Introduction to memcachedIntroduction to memcached
Introduction to memcached
 
(DAT407) Amazon ElastiCache: Deep Dive
(DAT407) Amazon ElastiCache: Deep Dive(DAT407) Amazon ElastiCache: Deep Dive
(DAT407) Amazon ElastiCache: Deep Dive
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 
4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook
 
Pecl Picks
Pecl PicksPecl Picks
Pecl Picks
 
20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag
 
Cassandra
CassandraCassandra
Cassandra
 
Keeping Spark on Track: Productionizing Spark for ETL
Keeping Spark on Track: Productionizing Spark for ETLKeeping Spark on Track: Productionizing Spark for ETL
Keeping Spark on Track: Productionizing Spark for ETL
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 
Designing enterprise drupal
Designing enterprise drupalDesigning enterprise drupal
Designing enterprise drupal
 
Speed up R with parallel programming in the Cloud
Speed up R with parallel programming in the CloudSpeed up R with parallel programming in the Cloud
Speed up R with parallel programming in the Cloud
 
Logstash
LogstashLogstash
Logstash
 
Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011
 
Say YES to Premature Optimizations
Say YES to Premature OptimizationsSay YES to Premature Optimizations
Say YES to Premature Optimizations
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.js
 

Dernier

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Dernier (20)

MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 

Bottom to Top Stack Optimization - CICON2011

  • 1. Bo#om  to  Top  Stack   Op.miza.on   With  LAMP  +  CodeIgniter  
  • 2. Server  side:  It’s  About  I/O   Network  I/O   Disk  I/O   CPU  
  • 3. Server/Client  side:     Minimize  and  Cache  Assets  
  • 4. Op.miza.on  Roadmap   •  System   •  MySQL   •  Apache   •  PHP   •  Framework   •  Applica.on  
  • 5. Tes.ng   •  Frontend   –  Yslow   •  Backend   –  `ab`   –  vmstat  
  • 6. LAMP  Configura.on   •  By  default,  for  “compa.bility”   •  You’re  responsible  for  your  boxes  
  • 7. System   •  Don’t  swap   –  Swap  in  itself  isn’t  bad,  swapping  out  is   •  Get  rid  of  non-­‐essen.al  processes   •  a.me  –  Filesystem  op.on  to  write  ‘last-­‐ accessed’  .me  to  everything   $  cat  /   •  If  you’re  a  badass,  check  into  XFS  
  • 8. a.me   $ cat /etc/fstab proc /proc proc defaults 0 0 /dev/sda1 / ext3 defaults,errors=remount-ro,noatime 0 1 /dev/sda2 none swap sw 0 0
  • 9. MySQL   •  Don’t  “SELECT  *”   –  If  the  data  you  need  is  in  an  index,  MySQL  will  grab  that   •  Column  indexes   –  Foreign  key  type  matching   –  Be  smart  about  column  size   –  Integrity  checks?  Try  NOT  dele.ng  instead   •  Batched  queries   •  Key  Buffer   •  Query  Buffer   •  Engine   –  InnoDB,  or  go  crazy  and  use  Percona  XtraDB  with  XFS  
  • 10. Apache   •  Kill  unneeded  modules   •  Tune  MaxClients   •  Eliminate  .htaccess,  if  possible   •  Kill  access  logs   •  Disable  ETags  if  not  used   •  Expires  Headers   •  Compression   •  Don’t  serve  sta.c  content  (if  you  can  avoid  it)  
  • 11. Benchmarking   •  Apache  bench  is  most  common   –  Tests  Requests  Per  Second   •  Use  vmstat  to  watch  swap  usage   •  Send  1,000  requests,  concurrency  of  10            $ ab –n 1000 –c 10 http://getsparks.org
  • 12. Finished  10000  requests     Server  Soiware:                Apache/2.2.12   Server  Hostname:                getsparks.org   Server  Port:                        80     Document  Path:                    /   Document  Length:                9865  bytes     Concurrency  Level:            10   Time  taken  for  tests:      6.040  seconds   Complete  requests:            10000   …   Requests  per  second:        1655.63  [#/sec]  (mean)   Time  per  request:              6.040  [ms]  (mean)   Time  per  request:              0.604  [ms]  (mean,  across  all  concurrent  requests)   Transfer  rate:                    16260.41  [Kbytes/sec]  received     Percentage  of  the  requests  served  within  a  certain  .me  (ms)      50%          10      …   100%          60  (longest  request)  
  • 13. $ vmstat 5 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 55152 53212 15128 69172 0 0 0 1 0 1 0 0 100 0 1 0 55152 54428 15132 69172 0 0 0 20 56 48 0 0 100 0
  • 14. Killing  Apache  Modules   $ a2dismod Your choices are: alias auth_basic authn_file authz_default authz_groupfile authz_host authz_user autoindex cgi deflate dir env expires mime negotiation php5 rewrite setenvif status
  • 15. Tuning  MaxClients   “You  can,  and  should,  control  the  MaxClients  se5ng  so  that  your  server  does   not  spawn  so  many  children  it  starts  swapping.”                        -­‐  Apache.org     Usually  in  h#pd.conf  or  apache2.conf     Find  average  size  of  h#p  process  with  `top`  (x).   How  much  RAM  to  dedicate  to  Apache?  (n).     MaxClients  =  floor(n  /  x)     Play  around  with  that  and  Apache  Bench  `ab`  
  • 16. Adding  Expires  Headers   <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/gif "access plus X days" ExpiresByType image/jpeg "access plus X days" ExpiresByType image/png "access plus X days" ExpiresByType text/css "access plus X days" ExpiresByType text/js "access plus X days" ExpiresByType text/javascript "access plus X days" ExpiresByType application/javascript "access plus X days" ExpiresByType application/x-javascript "access plus X days" ExpiresDefault "access plus X days" </IfModule>
  • 17. mod_deflate   •  Compress  your  stuff,  comes  with  Apache   $ a2enmod deflate # … configure in global or vhost config … AddOutputFilterByType DEFLATE text/html text/plain text/xml # … restart Apache $ apache2ctl -k restart
  • 18. Killing  ETags   $  a2enmod  header   #  open  apache.conf  or  h#pd.conf,  add:   Header  unset  ETag   FileETag  None   $  apache2ctl  –k  restart    
  • 19. HTTP  Accelerators   •  Serving  sta.c  content  is  VERY  expensive  for   Apache   •  Varnish,  Squid   $  apt-­‐get  install  varnish   #  go  to  varnish-­‐cache.org  
  • 20. PHP   •  APC   –  Caches  PHP  Op-­‐code,  can  use  as  cache   –  Faster  than  memcache  for  one  box   •  PHP  5.3   •  mysqlnd     •  Output  buffering  tuning,  send  data  to  client   more  frequently  
  • 21. APC  Install   $  apt-­‐get  install  php-­‐pear   …   $  pecl  install  apc       Then  take  a  look  at  cache  size:  apc.shm_size  
  • 22. Framework  (CodeIgniter)   •  Page  Caching   –  Personalized  info,  uh  oh.   •  Query  Result  Caching   •  Configura.on   –  Disable  verbose  logging   –  Output  compression   –  config/database.php:  autoinit?   •  Minifying,  combining  assets   –  ‘assets’  Spark  
  • 23. Applica.on   •  Most  op.miza.on  does  not  occur  within  code   •  Use  built-­‐in  PHP  func.ons   •  Use  associa.ve  arrays  (hashes,  dic.onaries)   •  Batch  DB  Inserts,  Selects   •  Don’t  use  references  unless  it  makes  sense   –  Like…  $CI  =  &  get_instance();   •  require_once  is  expensive   •  count()  elements  before  start  ‘for’  loop  
  • 24. Applica.on  (cont’d)   •  Don’t  copy  variables  if  you  don’t  have  to    foreach($db_result  as  $row)  {      $content  =  $row[‘content’];      $content  =  word_limited($content,  100);    }     And  the  usual:  require_once,  etc.  
  • 25. Find  one  or  two  numbers  in  an  array  that  add  to  10.     The  gross  way  —  n2     $set  =  array(1,  6,  7,  2,  5,  0,  8);     foreach($set  as  $a)  {    foreach($set  as  $b)  {      if($a  +  $b  ==  10)        exit(“Found  $a  and  $b”);    }   }      
  • 26. Find  one  or  two  numbers  in  an  array  that  add  to  10.     The  real  way  —  n     $set  =  array(1,  6,  7,  2,  5,  0,  8);   $flipped  =  array_flip($a);     foreach($set  as  $el)  {    $needed  =  10  -­‐  $el;    if(array_key_exists($needed,  $flipped))      exit(“Found  $el  and  $needed”);   }      
  • 27. When  You  Get  Big   •  More  machines!  with  load  balancing   •  memcached   •  Master-­‐slave  db  setup   –  Writes  to  master,  reads  to  slave  
  • 28. Takeaways   •  GetSpark’s  APC-­‐based  Output  override   •  These  slides          codefury.net/cicon2011   Kenny  Katzgrau    @_kennyk_