Date: Mon, 2 Jul 2001 18:51:21 +0300 From: teo@gecadsoftware.com To: <freebsd-questions@freebsd.org> Subject: Re: Is it possible to get more power from a FreeBSD system running Apache/MySQL/PHP ? Message-ID: <20010702185121.D11890@gecadsoftware.com> In-Reply-To: <PHEBIOJOBJJLIIJCOINKCEJODMAA.nadir@attractive.com>; from nadir@attractive.com on Mon, Jul 02, 2001 at 03:13:24PM %2B0200 References: <PHEBIOJOBJJLIIJCOINKCEJODMAA.nadir@attractive.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi Nadir!
On Mon, 02 Jul 2001, Nadir@Attractive wrote:
> I have few questions:
>
> 1. Anyone knows if Apache 2.0 can handle more visitors than Apache 1.3.x
> in the current configuration that we have?
Apache 2.0 is suppose to be multithreaded, and the preliminary benchmarks
I saw were promising, but Apache 1.3 is tough enough.
> 2. Can I optimize the FreeBSD system that we currently have even further
> to get more power of the server?
I have not much experience w/ FreeBSD (newcomer to it) but I can share some
of my experience
> 3. The MAXUSERS configuration parameter is set to 256, and this is the
> kernel's setting now. If I set it to be larger, say 1024, will it yield
> better results?
that is one of the points.
you'll have to recompile the kernel for that, and don't worry, you'll
get an improved version, cuz you'll keep in only what you need.
then take a look at sysctl. You have several paramenters that can be
adjusted, namely number of open files per process, size of network buffers
etc. You'll have to tune it for your configuration (e.g. for network
performance you have several tool in FreeBSD for that, check the packages)
> 4. Personally I think that this server can do MUCH better, and maybe the
> server's configuration is inaccurate, or insufficient. Any suggestions
> where to start?
1. Tune Apache
2. Tune MySQL
3. Tune PHP
1. Apache
- Check Apacheweek.com. I think there I saw once some recomandations
e.g.
HostnameLookups On - do you really need to have the hostnames in the logs?
remember that this mean a DNS query for each client. Turn it off, and
have the logs analized offline, if you want the FQDNs of the visitors
ExtendedStatus On - another resource consuming directive. Turn it off
on production servers.
FollowSymLinks - try to avoid it; if you don't have any symlinks, taek it
out.
Another tricks for high trafic would be:
Logging - what do we actually need logged? There are a lot of pages out there
designed with Dreamwaver or other tools that produce thousands of mages,
and a complete page has a correspondent in lots of entries in the logs,
99.99% of them regarding images.
I bet a check on request is faster than a disk write, so
SetEnvIf Request_URI "\.(gif|jpe?g)$" dont_log=1
CustomLog /var/log/www/www.ravantivirus.com-access_log common env=!dont_log
Headers - there aren't much, but they are something
http.conf - ServerTokens ProductOnly
php.ini - expose_php = off
Images delivery -
I've heard about a nice trick to speed up images delivery.
You set up a separate sever for images, e.g.
for www.foobar.com, have images.foobar.com, which only delivers images
this should be a separate server, namely a trimmed down Apache,
statically link which eventually to use MapFile to map most requested
files (e.g. the one from menus etc.) or thttpd, a faster server for
statical content.
Note that if you set a cookie it will be sent along even in the requests
for images, so if you have lots of big and yummy cookies, they will
eat bandwidth on each of that miriad of requests for the fancy menus your
designer(s) made.
Having a separate domain for images cuts them out, cause they won't be
sent anylonger (for an obvious reason, i.e. different "domain")
2. PHP
- Compile PHP statically into Apache (--with-apache, not --with-apxs)
so you'll save php loading time.
- Your process grew that big because the memory allocated by PHP isn't
return to the system, so the httpd process grows in time. You may try
to use --with-memory-limit when configuring php to impose a memory limit
or better:
- when doing large queries, don't fetch them into arrays, but just
use mysql_fetch_array() as you need and don't forget
mysql_free_result() at the end.
- have a code review and profiling, to see where it spends more time
and which scripts eat up lots of memory. Generally, it's because of db
queries.
1+2. Compressed output
- can be done either with mod_gzip.c or with a Rewrite trick or at PHP
level; long story and interesting :)
on short, for clients that say "Accept-Encoding: gzip" in request headers
you can send compressed content.
PHP as of 4.0.5 (IIRC) has a working ob_gzhanlder, and you can do it at
PHP level.
3. MySQL
- I don't have much experience w/ MySQL tunning parameters, so not much to
say on it;
- under support-files in MySQL distribution you have some samples of
my.cnf for different needs. Take a look, it might be that my-large.cnf
or my-huge.cnf can suit your needs (just copy it to /etc/my.cnf)
- other stuff I remember is that MySQL performs better on "reads", so try
to avoid inserts or use LOW_PRIORITY. Optimize your most common tables
often (use isamchk), you'll "feel" the difference. Pay special atention to
indexes (read "optimization tricks" from mySQL manual - spoiler: have an
index for any field appearing in where clauses)
4. Network
Probably other FreeBSD wizards have tips on tunning network throughput
hope it helps.
-- teodor
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010702185121.D11890>
