Annotation of embedaddon/lighttpd/doc/outdated/performance.txt, revision 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>