High system in %system load .

Jeremy Chadwick koitsu at FreeBSD.org
Wed Nov 19 03:35:59 PST 2008


On Wed, Nov 19, 2008 at 11:43:09AM +0100, Ivan Voras wrote:
> Igor Lyapin wrote:
> > I already sent # top head in my first mail
> > that's all non idle top process
> > 
> > last pid: 56920;  load averages:  2.90,  2.25,  1.72                 up
> > 0+22:10:12  20:04:05
> > 210 processes: 2 running, 207 sleeping, 1 zombie
> > CPU states:  8.3% user,  0.0% nice, 32.5% system,  0.3% interrupt, 58.9%
> > idle
> > Mem: 1268M Active, 1904M Inact, 479M Wired, 154M Cache, 214M Buf, 125M Free
> > Swap: 8192M Total, 8192M Free
> > 
> >   PID USERNAME       THR PRI NICE   SIZE    RES STATE  C   TIME   WCPU
> > COMMAND
> > 55546 www              1  -4    0   198M 24912K ufs    1   0:25 29.39% httpd
> > 55986 www              1  -4    0   198M 23228K ufs    2   0:08 21.39% httpd
> > 56030 www              1  -4    0   199M 23400K ufs    1   0:05 11.23% httpd
> 
> Ok, high sys load in "ufs" state for me was often caused by PHP session
> storage. By default, PHP will store all session records in a single
> directory, which can grow to monstruous sizes. If this is also your
> case, here are some things to try:
> 
> a) increase vfs.ufs.dirhash_maxmem to 10 MB or something like that (look
> at vfs.ufs.dirhash_mem to see if you're hitting the limit and if so,
> monitor it to see what your dirhash_maxmem limit should be)
> b) configure PHP to use "sharded" directory structure for sessions.

Good catch, Ivan!

Also, I recommend tuning the session.gc_* php.ini variables to expire
sessions more often (less files laying around means less CPU due to
readdir()).  The defaults PHP uses are absurd.

I also hate how the session files end up in /var/tmp, making a gigantic
mess.  I made a separate directory for them, with specific perms (1777)
for security:

drwxrwxrwt  2 root  wheel  1024 Nov 19 03:33 /var/tmp/php_sessions/

The piece of php.ini we use on our production web servers:

[session]
session.save_path = "/var/tmp/php_sessions"
session.gc_maxlifetime = 900
session.gc_probability = 25
session.gc_divisor = 100

See the PHP documentation for what these variables do.

-- 
| Jeremy Chadwick                                jdc at parodius.com |
| Parodius Networking                       http://www.parodius.com/ |
| UNIX Systems Administrator                  Mountain View, CA, USA |
| Making life hard for others since 1977.              PGP: 4BD6C0CB |



More information about the freebsd-stable mailing list