草庐IT

php - 大量轻量级连接的 Apache2 优化技巧

coder 2024-05-04 原文

我们有一个用 PHP 编写的非常轻量级的跟踪脚本,运行在 Apache/2.2.14 (Ubuntu) 上。该脚本将接收大量并发连接,但每个连接都很快。目前,我们使用的是prefork,配置如下:

StartServers          5
MinSpareServers       5
MaxSpareServers      10
ServerLimit         600
MaxClients          600
MaxRequestsPerChild   0

我们还有 KeepAlive Off

我已经对这些设置进行了相当多的尝试,并且一直在使用 apache 基准进行测试。每当我提高与 ab 的并发连接时,我都会收到“apr_socket_recv:连接由对等方 (104) 重置”。我还提高了文件描述符的最大数量。

我想知道是否有任何 Apache 专家可以为我指出此类设置(大量轻量级连接)的正确方向。 StartServers、Min/MaxSpareServers 等的最佳值是多少? worker MPM 值得研究吗?欢迎任何想法。

最佳答案

我可以给你一些提示:

  • 尝试在 worker 模式下使用 Apache 而不是 prefork。要做到这一点,要么将 PHP 置于 fastcgi 模式(php-fpm),要么冒险将其保存在线程 apache worker 中的 mod_php 中(风险是 siome 外部库可能会发生冲突,例如区域设置,但如果您的 PHP 跟踪代码是小你可以控制启用多线程的所有东西——没有任何外部库的 PHP5 是启用多线程的)
  • 如果您的 MaxClient 为 600,则将 600 放入 StartServersMinSpareServersMaxSpareServers。 else Apache 正在 very low speed 创建一个新的分支:

the parent process creates new children at a maximum rate of 1 per second.

如果您认为您的服务器可以处理 600 个 fork ,那么获取 RAM,创建 600 个 fork ,并可能将 MaxRequestsPerChild 设置更改为 3000 之类的值,这样有时旧的 fork 会被删除并重新创建(避免内存泄漏)。您不会在 fork 创建率上浪费任何时间,Apache 也不会浪费任何时间来管理子节点的创建和删除。

  • 禁用 KeepAlive 对您来说是一件好事,就像您所做的一样
  • 要知道 MaxLients 的正确值是多少,无论是在 prefork 还是 worker 模式下,只需对其进行测试,跟踪一个 fork 使用的内存并将可用 RAM 的 siez 除以该数字。注意,php 也会使用一些 RAM,使用 mod_php 这个 RAM 将在 apache fork 内存使用中,在 php-fpm 中它将在 php-fpm 进程中,检查 memory_limit 设置一个 PHP 进程的最大大小的 PHP。
  • 减少您的 PHP RAM 使用量,以便您能够并行运行更多 PHP 脚本。不要构建大数组,保持 session 轻量等。使用 APC 操作码可能会减少内存占用(并做其他好事),同时使用 PHP 5.3 而不是 5.2。

关于php - 大量轻量级连接的 Apache2 优化技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8087362/

有关php - 大量轻量级连接的 Apache2 优化技巧的更多相关文章

  1. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  2. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  3. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  4. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  5. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  6. ruby-on-rails - 连接字符串时如何在 <%=%> block 内输出 html_safe? - 2

    考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://

  7. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  8. ruby-on-rails - 什么会导致与 APNS 的连接间歇性断开连接? - 2

    我有一个ruby​​脚本可以打开与Apple推送服务器的连接并发送所有待处理的通知。我看不出任何原因,但当Apple断开我的脚本时,我遇到了管道损坏错误。我已经编写了我的脚本来适应这种情况,但我宁愿只是找出它发生的原因,这样我就可以在第一时间避免它。它不会始终根据特定通知断开连接。它不会以特定的字节传输大小断开连接。一切似乎都是零星的。您可以在单个连接上发送的数据传输或有效负载计数是否有某些限制?看到人们的解决方案始终保持一个连接打开,我认为这不是问题所在。我看到连接在3次通知后断开,我看到它在14次通知后断开。我从未见过它能超过14点。有没有人遇到过这种类型的问题?如何处理?

  9. ruby - 如何断开现有的 ruby​​ 续集与数据库的连接? - 2

    我的意思是之前建立的那个DB=Sequel.sqlite('my_blog.db')或DB=Sequel.connect('postgres://user:password@localhost/my_db')或DB=Sequel.postgres('my_db',:user=>'user',:password=>'password',:host=>'localhost')等等。Sequel::Database类没有名为“disconnect”的公共(public)实例方法,尽管它有一个“connect”。也许有人已经遇到过这个问题。我将不胜感激。 最佳答案

  10. ruby-on-rails - 遗留数据库的 ActiveRecord 连接表 - 2

    我有一个遗留数据库,我正在努力让ActiveRecord使用它。我遇到了连接表的问题。我有以下内容:classTvShow然后我有一个名为tvshowlinkepisode的表,它有2个字段:idShow、idEpisode所以我有2个表和它们之间的连接(多对多关系),但是连接使用非标准外键。我的第一个想法是创建一个名为TvShowEpisodeLink的模型,但没有主键。我的想法是,由于外键是非标准的,我可以使用set_foreign_key并进行一些控制。最后,我想说一些类似TvShow.find(:last).episodes或Episode.find(:last).tv_sho

随机推荐