73
PHP Performance on IBM i Part 2 Accelerate your application www.SeidenGroup.com

PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

  • Upload
    others

  • View
    37

  • Download
    1

Embed Size (px)

Citation preview

Page 1: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

PHP Performance on IBM i

Part 2 Accelerate your application

www.SeidenGroup.com

Page 2: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Speaker: Alan Seiden

• Principal at Seiden Group • Mentor CIOs and development teams

• Deliver modern technical solutions

• Host and sponsor of CIO Summit

• Club Seiden: The next generation • Open source advocate, contributor

!2

Page 3: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Seiden Group

!3

• Team of experts who: • Mentor IBM i teams, IT Directors, CIOs

• Consult on projects and process

• Develop applications

• Troubleshootwww.seidengroup.com

Page 4: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Club Seiden

!4

Forum for younger developers with a passion for open source, IBM i and collaboration

Page 5: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Second of three sessions on peformance

Session 1: How fast? Find the bottlenecks! (measure, measure, measure)

Session 2: Accelerate your application * (speed up PHP and the server back end)

Session 3: Ensuring a fast user experience (speed up the front end)

* You are here

!5

Page 6: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Session agenda

• DB2 and PHP performance tips

• Toolkit

• Zend Server configuration for speed

• Reducing IFS accesses

• Go asynchronous

!6

Page 7: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

PHP 7

!7

Page 8: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

PHP 7 is faster than previous versions

!8

• PHP 7.x comes with Zend Server 9.x• Speed boost• Spurred by competition with Facebook’s “Hack”

Page 9: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Let’s try a simple speed test<?php $profile['start'] = microtime( true );

for ($i=0 ; $i<1000000 ; $i++) { serialize($i); } $profile['end'] = microtime( true ); $profile['duration'] = $profile['end'] - $profile['start']; echo "Took " . $profile['duration']. " seconds ";

Try it from CALL QP2TERM or SSH terminal: cd /usr/local/zendsvr6/bin php -n /www/zendphp7/htdocs/test/speedtest.php cd /usr/local/zendphp7/bin php -n /www/zendphp7/htdocs/test/speedtest.php

!9

Page 10: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

PHP and Apache jobs

!10

Page 11: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Number of PHP jobs

• FastCGI PHP “children” § /www/zendphp7/conf/fastcgi.conf § Default: SetEnv=“PHP_FCGI_CHILDREN=10" § Increase from 10 to # of expected concurrent PHP requests § Each “child” needs temp storage, CPU, memory; find a balance

§

!11

Page 12: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Number of Apache HTTP threads

• Apache’s ThreadsPerChild • /www/zendphp7/conf/httpd.conf • Default: ThreadsPerChild 40 • Increase to number of expected HTTP connections

• PHP requests • CSS • Javascript • AJAX requests

!12

Page 13: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Active and idle thread dashboard

• “Real-time server statistics” on HTTP Admin page

!13

Page 14: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

DB2 and SQL

!14

Page 15: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Specs

• OS matters: Newer OS releases speed up complex DB2 queries with a smarter query optimizer

• IBM i is built to scale as large as its resources ‣ Example: IBM i’s query optimizer will choose the best

plan it can, given the amount of memory available to it. More memory, a more intelligent plan.

!15

Page 16: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

DB2 query optimization

• IBM i has great tools • You can find many articles written by DB2 experts

• I’ll share a couple of favorites ‣ Index Advisor ‣ SQL Plan Cache

• See IBM’s book • IBM i Database Performance and Query Optimization • http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/topic/rzajq/

rzajq.pdf

!16

Page 17: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Index Advisor

• Now in web-based Navigator and Access Client Solutions • Recommends indexes across all queries

!17

Page 18: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

SQL Plan Cache

• Lets you see what queries are REALLY running, who’s running them, and how long they take

!18

Page 19: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Persistent db connections

!19

Page 20: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Persistent connections

•Create a pool of database jobs •Known as a “connection pool” •You will connect quickly because a job is waiting for you •DB2 will...

• Choose a job each time you run a query • Create new jobs to handle high workload

•The word “persistent” may be misleading •No guarantee that a PHP script connects to same job each

time •Cannot rely on maintaining state (QTEMP, library lists)

between requests !20

Page 21: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

db2_pconnect() to connect persistently

•resource db2_pconnect ( string $database , string $username , string $password [, array $options ] )

• Persistent is much faster than non-persistent § db2_pconnect can reuse connections, reducing the time needed

to connect (after the first time) to almost zero

• How db2_pconnect() reuses connections § Connections defined by database, username, and password § Tries to reuse an existing connection matching these 3 params § db2_close() on a persistent connection does nothing § db2_pclose() forces the conn to close

!21

Page 22: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Rules for using persistence

• Because connections are shared when defined with an identical database, user, and password, please: § Avoid unpredictable results by also specifying the same $options

for these connections § Promote sharing of jobs by minimizing the number of user

profiles that you connect with • Each user profile creates a new set of database jobs • Each set of jobs consumes system resources when they start • Though jobs don’t do much harm once they are started

!22

Page 23: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Persistence = connection pool

• On IBM i, job initialization is relatively slow § Gives us good things—auditing, logging, security § Solution: a pool of pre-initialized jobs

• Pre-started DB2 jobs save time § Generally run in subsystem QSYSWRK, job name QSQSRVR § These prestart jobs can be configured with CHGPJE command

• In PHP, persistent connections reuse initialized jobs § db2_pconnect() § Dramatic speed boost

!23

Page 24: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

db2_pconnect() example with library list

$database = 'MYDB';

$user = 'MYUSER'; $password = 'MYPASS';

// set library list (works the same for connect or pconnect)

$options = array('i5_naming' => DB2_I5_NAMING_ON, 'i5_libl' => 'MYLIB1 MYLIB2'

); $conn = db2_pconnect($database, $user, $password, $options);

if ($conn) {

echo "Connection succeeded."; } else { echo "Connection failed.";

} // MYTABLE will be found, if in library MYLIB1 or MYLIB2

$stmt=db2_exec($conn,"SELECT * FROM MYTABLE");

!24

Page 25: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Rules for using persistence

• Because connections are shared when defined with an identical database, user, and password, please: § Avoid unpredictable results by also specifying the same $options

for these connections § Promote sharing of jobs by minimizing the number of user

profiles that you connect with • Each user profile creates a new set of database jobs • Each set of jobs consumes system resources

• More information: § “DB2 and PHP Best Practices on IBM i” at http://

seidengroup.com/presentations

!25

Page 26: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

More about db2_connect, db2_pconnect

•Manual pages § http://www.php.net/manual/en/function.db2-

connect.php § http://www.php.net/manual/en/function.db2-

pconnect.php § http://www.php.net/manual/en/features.persistent-

connections.php

!26

Page 27: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

DB2 server prestart job configuration

• Prestart jobs named QSQSRVR run in QSYSWRK • Or, if remote DRDA, QRWTSRVR in QUSRWRK • Configurable pool of jobs CHGPJE SBSD(QSYS/QSYSWRK) PGM(QSYS/QSQSRVR)

STRJOBS(*YES) INLJOBS(xx) THRESHOLD(xx) ADLJOBS(xx) MAXUSE(xx or *NOMAX)

• Defaults are somewhat low ‣ Initial jobs = 5, threshold = 2, adljobs = 2. Maxuse = 200

(*NOMAX may be better)

• More information about QSQSRVR prestart jobs ‣ http://www.mcpressonline.com/tips-techniques/database/techtip-

grab-control-of-the-db2-qsqsrvr-jobs.html

!27

Page 28: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

If you increase the prestart jobs...

• Consider increasing FastCGI and Apache settings mentioned in Session 1

‣ FastCGI PHP children ‣ Look in /www/zendphp7/conf/fastcgi.conf ‣ Default: SetEnv=“PHP_FCGI_CHILDREN=10" ‣ Increase from 10 to # of expected concurrent PHP requests ‣ Each “child” needs temp storage, CPU, memory; find a balance

‣ Next, Apache’s ThreadsPerChild ‣ /www/zendphp7/conf/httpd.conf ‣ Default: ThreadsPerChild 40 ‣ Increase to number of expected HTTP connections

!28

Page 29: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

PHP Toolkit

!29

Page 30: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Call RPG/COBOL: adapt 5250 logic to the web

!30

Page 31: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Toolkit Architecture

!31

RPG, COBOL, System Resources

XMLSERVICE

Your PHP code

Toolkit

Toolkit Methods

Sends XML

Page 32: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

PHP IBM i toolkit is open source

• Ships with Zend Server 5.6+ ‣ Many improvements since first release

• Where to start ‣ https://www.seidengroup.com/toolkit/

• Zend Forum ‣ http://forums.zend.com/viewtopic.php?f=113&t=41648 ‣ “PHP on IBM i”->”Zend Server for IBM i”->”New Toolkit” ‣ Many tips there

!32

Page 33: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Performance “don’t”s

• Don’t use disconnect() unless it’s the end of the day, logout, etc. ‣ Reconnection in stateful mode is slow ‣ Official samples set a bad example here

• Don’t allow inquiry messages to arise, hanging your job ‣ MONMSG in CL is one way to address

• Don’t run commands or programs with warning CPF ‣ Example: ADDLIBLE can return “already exists” error. Prefer CHGLIBL or

other technique ‣ Toolkit will fetch joblog for error reporting, which can be slow ‣ Not XMLSERVICE’s fault…in future we may allow “fast” (no joblog) mode

sometimes for non-critical errors

!33

Page 34: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Performance “do”s

• Don’t use disconnect() unless it’s the end of the day, logout, etc. ‣ Reconnection in stateful mode is slow ‣ Official samples set a bad example here

• Don’t allow inquiry messages to arise, hanging your job ‣ MONMSG in CL is one way to address

• Don’t run commands or programs with warning CPF ‣ Example: ADDLIBLE can return “already exists” error. Prefer CHGLIBL or

other technique ‣ Toolkit will fetch joblog for error reporting, which can be slow ‣ Not XMLSERVICE’s fault…in future we may allow “fast” (no joblog) mode

sometimes for non-critical errors

!34

Page 35: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Share existing DB2 conn with toolkit

Either db2_pconnect or regular db2_connect can be used. Share a connection instead of creating a new one in the toolkit.

require_once('ToolkitService.php');

// connect to db using chosen i5 naming mode

$namingMode = DB2_I5_NAMING_ON; // ON or OFF // connect to db

$db = db2_connect('DBNAME', 'user', 'pass', array('i5_naming' => $namingMode));

// Connect to toolkit, passing db resource and i5 naming mode instead of dbname/user/password.

$conn = ToolkitService::getInstance($db, $namingMode);

!35

Page 36: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Avoid RTV* commands if need speed

• RTVJOBA, RTVUSRPRF, etc. ‣ Handy for diagnostics, and they work fine ‣ Inside the toolkit they use REXX, which makes them slow ‣ Avoid in production environments that need to scale ‣ Alternative: compile RTV* command into a CL, then call the CL from

toolkit

// RTVJOBA works but is relatively slow require_once('ToolkitService.php');

$cmdString = 'RTVJOBA JOB(?) USER(?) NBR(?) CURUSER(?) SYSLIBL(?) CURLIB(?) USRLIBL(?) LANGID(?) CNTRYID(?) CCSID(?N) DFTCCSID(?N)'; // Send the command; get output array of key/value pairs. Example: CURUSER=>FRED, ...

$outputArray = $this->ClCommandWithOutput($cmdString);

!36

Page 37: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Do not use disconnect()

• The disconnect() method ends the toolkit job • When you connect again it will be slow to restart • Better to leave the job running. It will not use much resources

when idle • If you really want the toolkit job to end, use “idle timeout,”

where the job ends after a period of inactivity

require_once('ToolkitService.php'); $conn = ..... connect....

$conn->setOptions(‘internalKey’=>’/tmp/alan123’)); // end job after an hour of inactivity

$conn->setOptions(array(‘idleTimeout’=>3600));

!37

Page 38: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Or use stateless mode

• In stateless mode, no jobs are created besides database jobs • It’s the simplest way to connect to the toolkit • Use a persistent connection (parameter 5 = true) for speed

‣ You can also pass in an existing persistent connection (shown a few slides back)

require_once('ToolkitService.php'); $conn = ToolkitService::getInstance(‘*LOCAL’, ‘ALAN’, ‘ALANPW’, ‘ibm_db2’, true); // true = persistent connection $conn->setOptions(‘stateless’=>true)); // stateless is simple

!38

Page 39: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Or use stateless mode

• In stateless mode, no jobs are created besides database jobs • It’s the simplest way to connect to the toolkit • Use a persistent connection (parameter 5 = true) for speed

‣ You can also pass in an existing persistent connection (shown a few slides back)

require_once('ToolkitService.php'); $conn = ToolkitService::getInstance(‘*LOCAL’, ‘ALAN’, ‘ALANPW’, ‘ibm_db2’, true); // true = persistent connection $conn->setOptions(‘stateless’=>true)); // stateless is simple

!39

Page 40: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Reduce IFS reads/writes

!40

Page 41: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

IFS not as robust as DB2

• IBM i reverses the normal dynamic § Database (DB2) is fast; stream file access (IFS) can be slower

• Depends on workload, how many files accessed § Not as important as reducing HTTP access or other network

activity, for example

• Here are several tips...

!41

Page 42: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Tips to reduce IFS accesses

• Turn off or reduce logging to files in production ‣ Large log files can be a culprit on some systems

• Make files cacheable for long periods of time by setting “expires” headers (see Session 3 for more) ‣ https://httpd.apache.org/docs/current/mod/

mod_expires.html

• Use an opcode cache (see Optimizer+ discussion later in presentation)

• more on next slide

!42

Page 43: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

More tips to reduce IFS accesses

• In the UNIX world, file access is called “stat”. Any tips for reducing IFS “stats” will be effective on IBM i

• Examples:

• In Apache, turn off checking for .htaccess files if you’re not using them, with “AllowOverride none” ‣ # disable htaccess checks <Directory /> AllowOverride none </Directory>

• Allow symbolic links ‣ Options +FollowSymLinks -SymLinksIfOwnerMatch ‣ Otherwise, Apache will make a separate call on each filename to

ensure it is not a symlink.

!43

Page 44: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Zend Server config for speed

!44

Page 45: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Zend Server for IBM i

• Download ‣ http://www.zend.com/en/products/server/downloads-ibmi

• Zend Server 9.x editions ‣ http://www.zend.com/en/products/server/editions-ibm-i ‣ Basic, Professional, Enterprise ‣ Same download, different license

• Professional and higher include the monitoring/tracing tools we’ll be discussing here

!45

Page 46: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Make the most of OpCache

• OpCache: “opcode cache” that speeds PHP execution ‣ The first time a PHP script runs, OpCache stores the compiled

version in memory, speeding future runs

‣ Works well with its default settings

• What’s configurable? ‣ Amount of memory to allocate to OpCache ‣ Number of scripts to keep in memory ‣ Timestamp-checking interval ‣ How often to check if a script has been changed

• Next slide: details on the timestamp-checking interval

!46

Page 47: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Timestamp checking by OpCache

• Timestamp validation frequency: how often OpCache will check if a script has been changed § Ensures you are not running stale code § Default: 2 seconds

• The default (2 secs) is usually OK • For max speed, disable timestamp validation via

admin GUI § Use in production only § Usually only a small improvement § But I’ve seen BIG improvement on systems with slow IFS access § Caution if you turn off timestamp validation:

• Changes to your app NOT applied till you clear optimizer cache • Good reason to keep timestamp validation on in development env.

!47

Page 48: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Turn off unused PHP extensions

• Extensions provide extra functionality to PHP § Each one uses memory

• Many are enabled by default § Default: ibm_db2 is on, SQL Server is off § Turn off those that you do not use § Do not turn off extensions needed by Zend Server’s GUI

• See my blog for exact instructions § http://www.alanseiden.com/2011/08/08/php-performance-tip-

disable-unused-extensions-with-zend-server/

!48

Page 49: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Cache it

!49

Page 50: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Two types of cache

• Zend Data Cache ‣ Save any type of data as key/value pairs ‣ Available in all editions of Zend Server ‣ Good for saving query results or any data that you want to reuse

• Zend Page Cache ‣ Cache a whole page (URL) ‣ Examples: home page (not

personalized), JSON content for state or country codes (thatdon’t change often)

!50

Page 51: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Zend Data Cache

• Save string or array data ‣ Similar to memcache

• APIs for shared memory and disk storage ‣ “shm” means shared memory. “disk” means disk ‣ zend_shm_cache_fetch(), zend_shm_cache_store() ‣ zend_disk_cache_fetch(), zend_disk_cache_store()

!51

Page 52: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Zend Data Cache

• How to use the APIs ‣ Pass a key name, an object or string, and the “time to live”

number (optional) • boolean zend_shm_cache_store(string [namespace::]key, mixed var [, int ttl])

• Example: cache district number for 300 seconds • $success = zend_shm_cache_store(‘district’, ‘12345’, 300);

‣ Fetch with just the key name • mixed zend_shm_cache_fetch(string [namespace::]key)

• Example: retrieve district number • $district = zend_shm_cache_fetch(‘district’); // false if fails to fetch

• White paper with examples ‣ http://static.zend.com/topics/Zend-Server-Data-Caching-

Whitepaper-0106-T-WP-R1-EN.pdf

!52

Page 53: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Zend Page Cache

• A premium feature of Zend Server • Set up URLs to cache via Zend Server’s GUI • Match exact URL or regular expression

!53

Page 54: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Reduce Session Locking

!54

Page 55: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

PHP session files remember info

• Can keep track of user who is logged in, for example ‣ Cookie in browser tells PHP which session file to use ‣ session_start() initiates session in PHP

• Opens and locks the file for updating ‣ Located in /tmp by default ‣ Access data via $_SESSION

array

!55

Page 56: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

AJAX requests burden sessions

• With AJAX, one page is > 1 request • Multiple requests (AJAX/JSON) in one page • If PHP sessions used (session_start), all requests from one

browser use same PHP session on back-end

!56

• Numerous PHP requests launched in one page. Note the “waterfall” shape; each waits for the previous to finish

Page 57: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Load test shows this session is slow

!57

Page 58: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

View from performance data investigator

!58

Page 59: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

DEQW everywhere

!59

Page 60: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Locking found

!60

Page 61: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Solution to AJAX session locking

!61

• As soon as your application finishes writing data to the session, close it • session_write_close() ends the lock

• You can still read $_SESSION array

• Comparison on next slide

Page 62: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Without, and with, session_write_close()

!62

WITHOUT session_write_close()

WITH IT Parallel run, faster! e.g. 834ms instead of 1.84ms

Page 63: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Go asynchronous

!63

Page 64: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Premium features that can help

• Zend Job Queue offloads long-running processes to run asynchronously. Examples: § Sending an email message § Crunching large datasets § Sending data to a web service on another server § Creating PDF files

!64

Page 65: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Job Queue is part of Zend Server

• Comes with Professional Edition and up • Web-based • See job status in Zend Server GUI • From the documentation: “Long-running report generation, order

processing, database cleanup, and pulling of RSS feeds are some examples of jobs that can be executed asynchronously. Zend Server for IBM i incorporates a job queue to provide full support for creating, executing and managing jobs to optimize application performance and reduce server load, minimizing application bottlenecks and improving the end-user experience. “

!65

Page 66: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Special abilities of Zend Job Queue

• Move tasks into a separate execution queue § Off-load to new process, later time, or different server

• Execute certain tasks at a specified time § Schedule, optionally repeat at intervals

• Use complex parameters

• Do it from a PHP API or Zend Server GUI

• Launch faster than PHP-CLI

!66

Page 67: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Creating Jobs

• Use createHttpJob() method

• Pass parameters § Simple: via query string $_GET § Complex: as an associative array of key => value pairs

• Set job options § Name, priority, schedule, etc. § Create deferred or recurring jobs

• Launch right from PHP or use the Zend Server UI

$queue = new ZendJobQueue(); $queue->createHttpJob('http://backend.local/jobs/

somejob.php');

!67

Page 68: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

More about Zend Job Queue

Specs: http://files.zend.com/help/Zend-Server/jobqueue-global-api.html Tutorial: http://files.zend.com/help/Zend-Server/working_with_jobs.htm

API signature for createHttpJob: int ZendJobQueue::createHttpJob ( string $url, array $vars, mixed $options)

Example with nested array variables: $queue = new ZendJobQueue(); $queue->createHttpJob( ‘http://yourIBMi.com/send_alert.php’, array(‘from’=> ‘[email protected]’, ‘to’=>array(‘[email protected]’, ‘[email protected]’)), array(‘persistent’=>false) );

!68

Page 69: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Job Queue Management

View job status and manage execution

!69

Page 70: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Other Job Capabilities

l Managing priorities l Job dependencies l Querying for jobs l Checking job status and queue statistics l Suspending and resuming recurring jobs & queues l Passing custom HTTP headers l Management of jobs

l Handling failures and controlling retries l Code tracing, monitor

!70

Page 71: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Job Queue Tip

l If task will run more than 60 seconds, increase the FastCGI request timeout

l /www/zendphp7/conf/fastcgi.conf ‣ Default: RequestTimeout="60"

• Otherwise you’ll get HTTP 408 errors and unpredictable results in the Job Queue GUI

• New in Zend Server 2018: manage long-running CLI jobs via Job Queue: https://www.itjungle.com/2018/09/10/zend-server-2018-brings-php-7-2-to-ibm-i/

!71

Page 72: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

That’s part 2. Coming up next...

!72

Session 3: Ensure a fast user experience

Page 73: PHP Performance on IBM i - Seiden Group slides/PHP on IBM i... · PHP Performance on IBM i ... • Recommends indexes across all queries!17. Alan Seiden Consulting Let your PHP apps

Let your PHP apps fly on IBM i: High Performance PHP (Part 2)Alan Seiden Consulting

Contact and tips

Alan Seiden Seiden Group Ho-Ho-Kus, NJ

!73

[email protected] ● 201-447-2437 ● twitter: @alanseiden

Free newsletter: http://seidengroup.com/tips

CIO Summit information:[email protected]