优化lighttpd以提升性能

2024-02-02 09:32
文章标签 优化 性能 提升 lighttpd

本文主要是介绍优化lighttpd以提升性能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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
有关这个话题的更多信息,请参看 http://www.kegel.com/c10k.html

配置

事件处理器可以由指定的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个文件描述符

  1. TCP/IP套接字到客户端的连接
  2. TCP/IP 和 Unix 域套接字到FastCGI进程
  3. 文件句柄到位于文档根目录的文件:检查文件是否存在

如果 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的更多信息,参见 http://oss.sgi.com/projects/fam/faq.html
有关gamin的更多信息,参见http://www.gnome.org/~veillard/gamin/overview.html

另请参见: 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

这篇关于优化lighttpd以提升性能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/670271

相关文章

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel