Annotation of embedaddon/lighttpd/doc/outdated/performance.txt, revision 1.1.1.1

1.1       misho       1: ========================
                      2: Performance Improvements
                      3: ========================
                      4: 
                      5: ------------
                      6: Module: core
                      7: ------------
                      8: 
                      9: :Author: Jan Kneschke
                     10: :Date: $Date: 2004/11/03 22:26:05 $
                     11: :Revision: $Revision: 1.3 $
                     12: 
                     13: :abstract:
                     14:   handling performance issues in lighttpd
                     15: 
                     16: .. meta::
                     17:   :keywords: lighttpd, performance
                     18: 
                     19: .. contents:: Table of Contents
                     20: 
                     21: Description
                     22: ===========
                     23: 
                     24: Performance Issues
                     25: ------------------
                     26: 
                     27: lighttpd is optimized into varying directions. The most important direction is
                     28: performance. The operation system has two major facilities to help lighttpd
                     29: a deliver its best performance.
                     30: 
                     31: HTTP Keep-Alive
                     32: ---------------
                     33: 
                     34: Disabling keep-alive might help your server if you suffer from a large
                     35: number of open file descriptors.
                     36: 
                     37: The defaults for the server are: ::
                     38: 
                     39:   server.max-keep-alive-requests = 128
                     40:   server.max-keep-alive-idle = 30
                     41:   server.max-read-idle = 60
                     42:   server.max-write-idle = 360
                     43: 
                     44: handling 128 keep-alive requests in a row on a single connection, waiting 30 seconds
                     45: before an unused keep-alive connection gets dropped by lighttpd.
                     46: 
                     47: If you handle several connections at once under a high load (let's assume 500 connections
                     48: in parallel for 24h) you might run into the out-of-fd problem described below. ::
                     49: 
                     50:   server.max-keep-alive-requests = 4
                     51:   server.max-keep-alive-idle = 4
                     52: 
                     53: would release the connections earlier and would free file descriptors without a
                     54: detrimental performance loss.
                     55: 
                     56: Disabling keep-alive completely is the last resort if you are still short on file descriptors: ::
                     57: 
                     58:   server.max-keep-alive-requests = 0
                     59: 
                     60: Event Handlers
                     61: --------------
                     62: 
                     63: The first one is the Event Handler which takes care of notifying the server
                     64: that one of the connections is ready to send or receive. As you can see,
                     65: every OS has at least the select() call which has some limitations.
                     66: 
                     67: ============ ========== ===============
                     68: OS           Method     Config Value
                     69: ============ ========== ===============
                     70: all          select     select
                     71: Unix         poll       poll
                     72: Linux 2.4+   rt-signals linux-rtsig
                     73: Linux 2.6+   epoll      linux-sysepoll
                     74: Solaris      /dev/poll  solaris-devpoll
                     75: FreeBSD, ... kqueue     freebsd-kqueue
                     76: ============ ========== ===============
                     77: 
                     78: 
                     79: For more information on this topic take a look at http://www.kegel.com/c10k.html
                     80: 
                     81: Configuration
                     82: `````````````
                     83: 
                     84: The event handler can be set by specifying the 'Config Value' from above
                     85: in the ``server.event-handler`` variable
                     86: 
                     87: e.g.: ::
                     88: 
                     89:   server.event-handler = "linux-sysepoll"
                     90: 
                     91: Network Handlers
                     92: ----------------
                     93: 
                     94: The basic network interface for all platforms at the syscalls read() and
                     95: write(). Every modern OS provides its own syscall to help network servers
                     96: transfer files as fast as possible.
                     97: 
                     98: If you want to send out a file from the webserver, it doesn't make any sense
                     99: to copy the file into the webserver just to write() it back into a socket
                    100: in the next step.
                    101: 
                    102: sendfile() minimizes the work in the application and pushes a file directly
                    103: into the network card (ideally).
                    104: 
                    105: lighttpd supports all major platform-specific calls:
                    106: 
                    107: ========== ==========
                    108: OS         Method
                    109: ========== ==========
                    110: all        write
                    111: Unix       writev
                    112: Linux 2.4+ sendfile
                    113: Linux 2.6+ sendfile64
                    114: Solaris    sendfilev
                    115: FreeBSD    sendfile
                    116: ========== ==========
                    117: 
                    118: The best backend is selected at compile time. In case you want to use
                    119: another backend set: ::
                    120: 
                    121:   server.network-backend = "writev"
                    122: 
                    123: You can find more information about network backend in:
                    124: 
                    125:   http://blog.lighttpd.net/articles/2005/11/11/optimizing-lighty-for-high-concurrent-large-file-downloads
                    126: 
                    127: 
                    128: Max Connections
                    129: ---------------
                    130: 
                    131: As lighttpd is a single-threaded server, its main resource limit is the
                    132: number of file descriptors, which is set to 1024 by default (on most systems).
                    133: 
                    134: If you are running a high-traffic site you might want to increase this limit
                    135: by setting ::
                    136: 
                    137:   server.max-fds = 2048
                    138: 
                    139: This only works if lighttpd is started as root.
                    140: 
                    141: Out-of-fd condition
                    142: -------------------
                    143: 
                    144: Since file descriptors are used for TCP/IP sockets, files and directories,
                    145: a simple request for a PHP page might result in using 3 file descriptors:
                    146: 
                    147: 1. the TCP/IP socket to the client
                    148: 2. the TCP/IP and Unix domain socket to the FastCGI process
                    149: 3. the filehandle to the file in the document root to check if it exists
                    150: 
                    151: If lighttpd runs out of file descriptors, it will stop accepting new
                    152: connections for awhile to use the existing file descriptors to handle the
                    153: currently-running requests.
                    154: 
                    155: If more than 90% of the file descriptors are used then the handling of new
                    156: connections is disabled. If it drops below 80% again new connections will
                    157: be accepted again.
                    158: 
                    159: Under some circumstances you will see ::
                    160: 
                    161:   ... accept() failed: Too many open files
                    162: 
                    163: in the error log. This tells you there were too many new requests at once
                    164: and lighttpd could not disable the incoming connections soon enough. The
                    165: connection was dropped and the client received an error message like 'connection
                    166: failed'. This is very rare and might only occur in test setups.
                    167: 
                    168: Increasing the ``server.max-fds`` limit will reduce the probability of this
                    169: problem.
                    170: 
                    171: stat() cache
                    172: ============
                    173: 
                    174: A stat(2) can be expensive; caching it saves time and context switches.
                    175: 
                    176: Instead of using stat() every time to check for the existence of a file
                    177: you can stat() it once and monitor the directory the file is in for
                    178: modifications. As long as the directory doesn't change, the files in it
                    179: must all still be the same.
                    180: 
                    181: With the help of FAM or gamin you can use kernel events to assure that
                    182: your stat cache is up to date. ::
                    183: 
                    184:   server.stat-cache-engine = "fam"   # either fam, simple or disabled
                    185: 
                    186: 
                    187: Platform-Specific Notes
                    188: =======================
                    189: 
                    190: Linux
                    191: -----
                    192: 
                    193: For Linux 2.4.x you should think about compiling lighttpd with the option
                    194: ``--disable-lfs`` to disable the support for files larger than 2GB. lighttpd will
                    195: fall back to the ``writev() + mmap()`` network calls which is ok, but not as
                    196: fast as possible but support files larger than 2GB.
                    197: 
                    198: Disabling the TCP options reduces the overhead of each TCP packet and might
                    199: help to get the last few percent of performance out of the server. Be aware that
                    200: disabling these options most likely decreases performance for high-latency and lossy
                    201: links.
                    202: 
                    203: - net.ipv4.tcp_sack = 0
                    204: - net.ipv4.tcp_timestamps = 0
                    205: 
                    206: Increasing the TCP send and receive buffers will increase the performance a
                    207: lot if (and only if) you have a lot of large files to send.
                    208: 
                    209: - net.ipv4.tcp_wmem = 4096 65536 524288
                    210: - net.core.wmem_max = 1048576
                    211: 
                    212: If you have a lot of large file uploads, increasing the receive buffers will help.
                    213: 
                    214: - net.ipv4.tcp_rmem = 4096 87380 524288
                    215: - net.core.rmem_max = 1048576
                    216: 
                    217: Keep in mind that every TCP connection uses the configured amount of memory for socket
                    218: buffers. If you've got many connections this can quickly drain the available memory.
                    219: 
                    220: See http://www.acc.umu.se/~maswan/linux-netperf.txt for more information on these parameters.
                    221: 
                    222: FreeBSD
                    223: -------
                    224: 
                    225: On FreeBSD you might gain some performance by enabling accept filters. Just
                    226: compile your kernel with: ::
                    227: 
                    228:   options   ACCEPT_FILTER_HTTP
                    229: 
                    230: For more ideas about tuning FreeBSD read: tuning(7)
                    231: 
                    232: Reducing the recvspace should always be ok if the server only handles HTTP
                    233: requests without large uploads. Increasing the sendspace would reduce the
                    234: system load if you have a lot of large files to be sent, but keep in mind that
                    235: you have to provide the memory in the kernel for each connection. 1024 * 64KB
                    236: would mean 64MB of kernel RAM. Keep this in mind.
                    237: 
                    238: - net.inet.tcp.recvspace = 4096
                    239: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>