PHP Performance: Principles and tools

Preview:

Citation preview

©All rights reserved. Zend Technologies, Inc.

PHP PerformancePrinciples and Tools

By Kevin Schroeder

Technology Evangelist

Zend Technologies

I have stickers!

©All rights reserved. Zend Technologies, Inc.

About Kevin

Past: Programming/Sys Admin

Current: Technology Evangelist/Author/Composer

@kpschrade

©All rights reserved. Zend Technologies, Inc.

Follow us! Zend Technologies

http://twitter.com/zend

http://twitter.com/kpschrade (me!)

©All rights reserved. Zend Technologies, Inc.

Join us at ZendConThe premier PHP conference!

October 17-19, 2011 – Santa Clara, CA

www.zendcon.com

Conference ThemesCloud ComputingLearn about the latest developments in PHP Cloud infrastructure, management and application services

Mobile and User ExperienceLearn how to build engaging mobile apps with the latest PHP technologies and tools

Enterprise and Professional PHPExplore PHP best practices, new technologies and practical tips with industry experts

Conference Highlights•Sessions focused on how to best develop and

deploy PHP

•Sessions designed for all knowledge levels

•Intensive tutorials for accelerated learning

•PHP Certification crash courses and testing

•Exhibit hall showcasing the latest products

•Special networking opportunities during meals and

events

©All rights reserved. Zend Technologies, Inc.

Quiz

Who here is a sysadmin?

Who here is a developer?

Who here is both?

©All rights reserved. Zend Technologies, Inc.

WARNING!• Performance is a HIGHLY context sensitive topic• There are no answers here; only possible

directions• Do not micro-optimize

20ms cf. 100ms is not a 5 fold improvement in performance, it is a 5 fold waste of your time• Unless you’re Yahoo, Google, Facebook, etc.

The perception of performance is as important as actual performance

• Use the scientific method to find performance problems Observe Hypothesize Experiment

• Solve one problem at a time and MEASURE RESULTS!

©All rights reserved. Zend Technologies, Inc.

General categories of performance problems

©All rights reserved. Zend Technologies, Inc.

Performance – Database

• Symptoms Pages take a long time to load with Apache/IIS/PHP using

proportionally less of the CPU time compared to DB

• Causes The list could go on for 4.23x105 slides

There are so many ways you can screw up your queries

• Tools Intra-application query monitoring, usually via a DB

adapter abstraction layer

Zend Server – A distinct group of monitoring options for DB calls in PHP

©All rights reserved. Zend Technologies, Inc.

Performance - Database

• Possible remedies Simplify your queries

Make your queries more complex

Tune your database

• Don’t just automatically allocate more memory

• Don’t just create indexes

• Keeping this light because there are other, better, MySQL performance experts (many of them here)

©All rights reserved. Zend Technologies, Inc.

Performance – Network Latency• Symptoms

Depends on where the latency is occurring

Often slow page responses with low CPU usage

• Causes Network Saturation (probably not too likely)

DNS Reverse Lookups

TCP Handshakes

High number of “hops”

TCP Backlog

… and much more

• Tools Wireshark

Tcpdump

Zend Server – monitor slow socket function execution

©All rights reserved. Zend Technologies, Inc.

The TCP handshake

T/TCP SYN + Response Data + FIN

T/TCP SYN + Response Data + ACK

+FIN

ACK

©All rights reserved. Zend Technologies, Inc.

Performance – IO Contention

• Symptoms Unpredictable and difficult to reproduce page load times, but

often corresponds to request frequency

• Causes Too few spindles serving too much data

High write concurrency

Insufficient free system RAM

Insufficient depth of data directory structure

• Tools Zend Server (in extreme cases, long fopen() calls)

vmstat & top (Linux)

System Internals Process Explorer (Windows)

©All rights reserved. Zend Technologies, Inc.

Performance – IO Contention

• Remedies Increase the number of disks

Favor directory depth over width for storing raw data files

Increase RAM so read operations can be pulled from memory

©All rights reserved. Zend Technologies, Inc.

Performance – CPU Utilization

• Symptoms Page load times either correspond directly to CPU utilization

or are consistently slow

• Causes Bad code or over-architected solutions

Excessive recursion

Excessive IO

High server utilization• too few servers serving too much traffic

• Tools top & vmstat (Linux)

System Internals Process Explorer (Windows)

©All rights reserved. Zend Technologies, Inc.

Performance – CPU Utilization

• There are often 2 different paths this will usually follow User time

• Time spent executing the code that you wrote

System time• Time spent running functionality that your code calls, such as

networking, file system, etc.

©All rights reserved. Zend Technologies, Inc.

Performance – Network Connectivity

• Symptoms Database or web service calls take long to execute

• Causes If read functions die unexpectedly, bad network hardware

might be a cause Slow DNS queries Full TCP backlog

• Tools Zend Server – monitor failed calls to socket_connect(), fsockopen() or fread()

Wireshark Tcpdump

©All rights reserved. Zend Technologies, Inc.

OO

• Beware of magic! __get, __set, __call

Situations where they are often used• When representing another object that it has no knowledge of

- I.e. Soap requests, COM objects, Java objects, database tables

• When there are property-level permissions on an object’s properties. Keeping the properties private and using __get/set to determine access

If used sparingly they won’t affect you, but many modern applications have lots of recursion or large underlying architectures that can have unpredicted consequences

©All rights reserved. Zend Technologies, Inc.

!Preg

• Use preg_match for data checking only when you have to stripos(‘http://’, $website) is over twice as fast as preg_match(‘/http:\/\//i’, $website)

ctype_alnum() is almost 5 times as fast as preg_match(‘/^\s*$/’);

Casting “if ($test == (int)$test)” is well over 5 times faster than preg_match(‘/^\d*$/)

• Preg will probably not bite you unless you have a lot of recursive logic that depends on it

©All rights reserved. Zend Technologies, Inc.

Tools

©All rights reserved. Zend Technologies, Inc.

OS tools to use

• Devs are really bad about thinking about the OS

• Use OS tooling!!! vmstat

top

tcpdump & wireshark

strace• Try strace httpd –X at least once

lsof• You can map file descriptors found in strace to descriptors in

lsof

©All rights reserved. Zend Technologies, Inc.

Zend Server

• Monitors for several events like slow requests, slow DB calls, high memory usage, etc.

• Provides the context for those requests

• Can be configured to provide profile-like data from production installations

• Has a built in queuing mechanism that allows you to offload non-immediate processing (which can actually be quite a lot)

©All rights reserved. Zend Technologies, Inc.

Do you queue?

• Offloading long running processes to a queuing system can help make your front end servers scale more vertically

• Examples include Job Queues

• Zend Server 5 (http://www.eschrade.com/ tag: job-queue)

• Gearman

• Beanstalk

Message Queues• ActiveMQ

• RabbitMQ

©All rights reserved. Zend Technologies, Inc.

TODO || ! TODO

©All rights reserved. Zend Technologies, Inc.

What not to do

This is not complete!!!• “Oh we’ll just cache it”• “Our NFS server is just fine for serving PHP files”

Use a frigging deployment mechanism• “That LIKE query is necessary”

You may need to structure your data a little different• Don’t make your DB gues

You might need to use a search engine instead• Zend_Search_Lucene• SOLR

• “Using arrays is faster than objects, we’ll use them instead”

• “Monitoring/diagnostic tools are too expensive”

©All rights reserved. Zend Technologies, Inc.

List of things to do

This is not complete!!!

• THINK before you code!!

• Minimize require_once calls/use an autoloader

• Try to make your architecture more horizontal rather than vertical People from Java backgrounds tend to go more vertical

There is often a correlation between long stack traces and poor performance

• Use Lazy Loading/Load on Demand SPL arrays and such are great for this

©All rights reserved. Zend Technologies, Inc.

List of things to do

• Use diagnostic tools! Zend Server Monitoring and Code Tracing

Some kind of profiler

• Utilize compiled PHP functionality for iterative complex functionality.

• Use Ajax Allows you to make a more responsive page by having fast

content available immediately and slow content available as it’s ready

©All rights reserved. Zend Technologies, Inc.

List of things to do

• With multiple service calls, consider batching multiple NB-IO requests Facebook does this, so it must be cool

Synchronous requests – 4.2 seconds

Asynchronous requests using curl – 1.5 seconds

©All rights reserved. Zend Technologies, Inc.

Fin

©All rights reserved. Zend Technologies, Inc.

Questions?

©All rights reserved. Zend Technologies, Inc.

To contact me after my presentation, text XIK to INTRO (46876)

Follow us! Zend Technologies

http://twitter.com/zend

http://twitter.com/kpschrade (me!)

©All rights reserved. Zend Technologies, Inc.

Join us at ZendConThe premier PHP conference!

October 17-19, 2011 – Santa Clara, CA

www.zendcon.com

Conference ThemesCloud ComputingLearn about the latest developments in PHP Cloud infrastructure, management and application services

Mobile and User ExperienceLearn how to build engaging mobile apps with the latest PHP technologies and tools

Enterprise and Professional PHPExplore PHP best practices, new technologies and practical tips with industry experts

Conference Highlights•Sessions focused on how to best develop and

deploy PHP

•Sessions designed for all knowledge levels

•Intensive tutorials for accelerated learning

•PHP Certification crash courses and testing

•Exhibit hall showcasing the latest products

•Special networking opportunities during meals

and events

©All rights reserved. Zend Technologies, Inc.

List of things to do

• Similarly, be careful when dealing with lots of Ajax data Developers running test data often under-estimate how

much data their code will send back

The browser needs to process that data

With large data sets the browser may take a while to update the DOM

2 options• Use staggered loading

• Pass rendered content to the browser and attach with innerHTML

©All rights reserved. Zend Technologies, Inc.

List of things to do

• Be aware of your page size Oracle – 104kb – 861ms

Zend – 183kb – 2.4 seconds

Microsoft – 238kb – 4.4 seconds

IBM – 640 kb – 4.6 seconds

• There is a relatively direct relationship between the amount of data on your web page and the render time

Recommended