优化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

相关文章

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

CPython与PyPy解释器架构的性能测试结果对比

《CPython与PyPy解释器架构的性能测试结果对比》Python解释器的选择对应用程序性能有着决定性影响,CPython以其稳定性和丰富的生态系统著称;而PyPy作为基于JIT(即时编译)技术的替... 目录引言python解释器架构概述CPython架构解析PyPy架构解析架构对比可视化性能基准测试测

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变