您的位置:首页 > 理论基础 > 计算机网络

优化lighttpd以提升性能

2008-10-21 20:20 267 查看
Lighttpd的优化是多方面的,最重要的就是优化其性能。操作系统有2大因素,可以帮助Lighttpd达到它的最佳性能。

HTTP Keep-Alive

禁用Keep-Alive可以帮助你的服务器减轻因大量打开着的文件描述符而产生的负载。
服务器默认的设置是:
server.max-keep-alive-requests = 128
server.max-keep-alive-idle = 30
server.max-read-idle = 60
server.max-write-idle = 360
在单个连接处理一行128个Keep-Alive的请求,在一个未被使用的Keep-Alive连接被Lighttpd丢弃之前等待30秒。

如果你在一个高负载环境下一次处理许多连接(假设在24小时内有500个平行连接),那你可能陷入了如下描述的
out-of-fd问题。
server.max-keep-alive-requests = 4
server.max-keep-alive-idle = 4
这样可以提前释放连接,并在不损失性能的情况下释放文件描述符。

完全禁用Keep-Alive是解决文件描述符短缺的最后手段:
server.max-keep-alive-requests = 0

事件处理器

首先是和通知服务器一个连接是否已经准备好发送或接收数据相关的事件处理器。
正如你所看到的,每一个操作系统至少有select()调用,但它有所限制。

OSMethodConfig Value
allselectselect
Unixpollpoll
Linux 2.4+rt-signalslinux-rtsig
Linux 2.6+epolllinux-sysepoll
Solaris/dev/pollsolaris-devpoll
FreeBSD, ...kqueuefreebsd-kqueue
NetBSDkqueuekqueue
有关这个话题的更多信息,请参看 

配置

事件处理器可以由指定的server.event-handler"配置值"(在上表列出)来设置。
例如:
server.event-handler = "linux-sysepoll"
网络处理器

对于所有平台最基本的网络界面位于read()和write()的系统调用。
每个现代操作系统都提供它自己的系统调用来帮助网络服务器尽可能快地传输文件。
如果你想从Web服务器发送一个文件,就是把文件拷贝进Web服务器然后仅为调用write()把它"写"进socket套接字,这根本行不通。

sendfile() 能在应用程序这方面最小化该项工作并把一个文件直接地(有创意地)推进网卡。

lighttpd 支持所有主要的指定了系统的调用:

OSMethodConfig Value
allwritewrite
Unixwritevwritev
Linux 2.4+sendfilelinux-sendfile
Linux 2.6+sendfile64linux-sendfile
Solarissendfilevsolaris-sendfilev
FreeBSDsendfilefreebsd-sendfile
最佳的后台已经在编译时选择。如果你想另选后台:
server.network-backend = "writev"
你可以在这里找到更多有关后台的信息:http://blog.lighttpd.net/articles/2005/11/11/optimizing-lighty-for-high-concurrent-large-file-downloads

最大连接数

由于 lighttpd 是一个单线程的服务器,它最大的资源限制是描述符的限制,在大部分平台上被设置为1024。如果你正运行着一个大流量站点,你也许会想把这个值设置得更大些:

server.max-fds = 2048

这个设置仅在Lighttpd以root身份运行时生效。
Out-of-fd 的情况

由于文件描述符为TCP/IP套接字所用,文件和目录,一个对PHP页面的请求也许会占用3个文件描述符

TCP/IP套接字到客户端的连接

TCP/IP 和 Unix 域套接字到FastCGI进程

文件句柄到位于文档根目录的文件:检查文件是否存在
如果 lighttpd 超出了文件描述符的数量,它会暂时拒绝接受任何新发起的连接以便使用现有的文件描述符来处理当前运行的请求。

如果多于 90% 文件描述符被占用,那么对新连接的处理会被禁用.。如果文件描述符占用率降到 80% 以下,那么Lighttpd会重新接受新连接。

某些情况下你可以在错误日志里看到:... accept() failed: Too many open files
这告诉你,曾同时发起过过量的新请求,Lighttpd一度无法迅速禁用入站连接。连接已被放弃,客户端会收到类似"connection failed"这样的出错信息。这种情况很稀少,可能仅在测试状态中发生.

放宽 server.max-fds 限制将使这种情况发生的可能性减少。

stat() 缓存

一个 stat(2) 可能很贵重;缓存它可以节省时间和环境的切换。

除了每次使用 stat() 检查一个文件的存在性,你可以 stat() 它一次然后监视此目录此文件的改动情况。只要目录不改变在其中的文件必定仍是原来的。

在 FAM 或者是 gamin 的帮助下,你可以使用内核事件来保证你的stat缓存是最新的。不一般的是你可以使用"simple" 方法,它可以在至多一秒内缓存结果。

启用 stat 缓存可以显著提升高负载服务器的性能。server.stat-cache-engine = "fam" # 可以是 fam, simple 或者 disabled(禁用)

有关FAM的更多信息,参见
有关gamin的更多信息,参见
另请参见: http://trac.lighttpd.net/trac/wiki/server.stat-cache-engineDetails

特定平台的说明

Linux

对于 Linux 2.4.x 你应该考虑使用 --disable-lfs 参数编译Lighttpd 来禁用对大于2GB文件的支持。lighttpd 将回到 writev() + mmap() 网络调用(也可以正常运行),但在大于2GB文件方面,可能速度不快。

禁用 TCP 选项减少每个 TCP 包的总开销,可能有助于利用服务器最后那点性能。注意禁用这些选项极可能降低处理高隐性和有损的链接。

net.ipv4.tcp_sack = 0

net.ipv4.tcp_timestamps = 0
增大 TCP 发送和接收缓冲将提升服务器性能,当(且仅当)你有很多大文件要发送。

net.ipv4.tcp_wmem = 4096 65536 524288

net.core.wmem_max = 1048576
如果你有许多大文件的上传,增加接收缓冲会对性能提升有所帮助。

net.ipv4.tcp_rmem = 4096 87380 524288

net.core.rmem_max = 1048576
一些对大流量站点非常有效的东西:# 这样保证了 TIME_WAIT 端口既不被拒也不快速关闭
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_recycle = 1
# TCP 内存
net.core.rmem_max = 16777216
net.core.rmem_default = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

# you shouldn't be using conntrack on a heavily loaded server anyway, but these are
# suitably high for our uses, insuring that if conntrack gets turned on, the box doesn't die
net.ipv4.ip_conntrack_max = 1048576
net.nf_conntrack_max = 1048576
记住每个 TCP 连接为套接字缓冲占用指定份额内存。如果你的服务器接到大量连接,那么它们会快速消耗剩余内存。

关于这些参数的更多信息,参见 http://www.acc.umu.se/~maswan/linux-netperf.txt

FreeBSD

在 FreeBSD 上你可以通过启用accept filters来增加一些性能。只要在所编译的内核文件里加入:options ACCEPT_FILTER_HTTP
或者简单地用如下命令加载:

kldload accf_http

打开/etc/rc.conf设置:
accf_data_load="YES"
accf_http_load="YES"

更多调整 FreeBSD 的信息,请阅读:tuning(7)

如果服务器仅处理无大文件上传的HTTP请求,减少 recvspace 总是有效的。如果你有大量大型文件要发送,增加 sendspace 可以减少系统负载,但请记住你必须在内核里提供每个连接的内存。1024 * 64KB 意味着内核RAM中的64MB。请记住。

net.inet.tcp.recvspace = 4096
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息