gpt4 book ai didi

PHP 生成页面,但不会立即将其返回给用户

转载 作者:行者123 更新时间:2023-12-02 18:05:02 25 4
gpt4 key购买 nike

我目前正在测试我正在组装的服务器设置的负载能力。 apache2 服务器上安装了 PHP 5.X,它连接到单独机器上的主数据库,然后连接到 2 个从服务器中的 1 个进行读取。

如果我自己调用它,我的测试页面需要 0.2 秒才能生成。我在另一台服务器上创建了一个 php 脚本,该脚本创建了 65 个对测试页面的同时调用。测试页面在整个页面上进行微时间基准测试,让我知道每个部分花费了多长时间。正如预期的那样 - 至少对我来说,如果有人对此有意见或建议,请随时发表评论 - 页面的 SQL 部分需要很短的时间来处理它收到的前几个请求,然后会降级,因为其余部分查询堆积起来并且必须等待。我认为这可能是磁盘 IO 问题,但在固态硬盘上测试时也出现了相同的行为。

我的问题是,我的测试脚本按照我的预期创建并加载了 65 个页面中的大约 30 个页面。例如,我的基准测试表明该页面在 3 秒内创建,而我的测试脚本表明它在 3.1 秒内完整接收了该页面。差别并不大。问题是,对于其他请求,我的基准测试显示页面在 3 秒内加载,但测试脚本直到 6 秒才完整接收页面。从 apache 服务器生成页面到发送回请求该页面的测试脚本之间整整花了 3 秒。为了确保这不是测试脚本的问题,我尝试在本地浏览器运行时加载页面,并通过 Chrome 中的时间线窗口确认了相同的延迟。

我已经尝试了 Apache 的各种配置,但似乎无法找到导致这种延迟的原因。我最近的尝试如下。该机器是四核 AMD 2.8Ghz 和 2Ghz RAM。任何有关配置的帮助或有关如何操作的其他建议将不胜感激。 -- 抱歉问了这么长的问题。

我应该提到,我在脚本运行时监控了资源,CPU 负载达到了最大 9%,并且始终有至少 1 GB 的空闲内存。

我还要提到,当我查询的只是静态 HTML 页面时,也会发生相同类型的情况。第一对需要 .X 秒,然后慢慢增加到 3 秒。

LockFile ${APACHE_LOCK_DIR}/accept.lockPidFile ${APACHE_PID_FILE}Timeout 120MaxClients            150KeepAlive OnKeepAliveTimeout 4MaxKeepAliveRequests 150Header always append x-frame-options sameorigin    StartServers         50    MinSpareServers      25    MaxSpareServers      50    MaxClients          150    MaxRequestsPerChild   0User ${APACHE_RUN_USER}Group ${APACHE_RUN_GROUP}AccessFileName .httpdoverride    Order allow,denyDefaultType text/plainHostnameLookups OffErrorLog ${APACHE_LOG_DIR}/error.logLogLevel warnInclude mods-enabled/*.loadInclude mods-enabled/*.confInclude httpd.confInclude ports.confLogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combinedLogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %O" commonLogFormat "%{Referer}i -> %U" refererLogFormat "%{User-agent}i" agentInclude conf.d/Include sites-enabled/AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phps    SecRuleEngine On    SecRequestBodyAccess On    SecResponseBodyAccess Off    SecUploadKeepFiles Off    SecDebugLog /var/log/apache2/modsec_debug.log    SecDebugLogLevel 0    SecAuditEngine RelevantOnly    SecAuditLogRelevantStatus ^5    SecAuditLogParts ABIFHZ    SecAuditLogType Serial    SecAuditLog /var/log/apache2/modsec_audit.log    SecRequestBodyLimit 131072000    SecRequestBodyInMemoryLimit 131072    SecResponseBodyLimit 524288000        ServerTokens Full        SecServerSignature "Microsoft-IIS/5.0"

更新:似乎很多回应都集中在 SQL 是罪魁祸首这一事实上。所以我在这里声明,静态 HTML 页面上也会发生相同的行为。下面列出了基准测试的结果。

Concurrency Level:      10Time taken for tests:   5.453 secondsComplete requests:      1000Failed requests:        899   (Connect: 0, Receive: 0, Length: 899, Exceptions: 0)Write errors:           0Total transferred:      290877 bytesHTML transferred:       55877 bytesRequests per second:    183.38 [#/sec] (mean)Time per request:       54.531 [ms] (mean)Time per request:       5.453 [ms] (mean, across all concurrent requests)Transfer rate:          52.09 [Kbytes/sec] receivedConnection Times (ms)              min  mean[+/-sd] median   maxConnect:        0   21 250.7      0    3005Processing:    16   33  17.8     27     138Waiting:       16   33  17.8     27     138Total:         16   54 253.0     27    3078Percentage of the requests served within a certain time (ms)  50%     27  66%     36  75%     42  80%     46  90%     58  95%     71  98%     90  99%    130 100%   3078 (longest request)

我还要声明,我通过使用 PHP 和 microtime() 确定延迟是在生成页面之前发生的。我通过生成页面和接收它的测试脚本之间的时间差来确定这一点。差异是一致的,这意味着无论整个请求花费多长时间,从生成页面到我的测试页面收到它的时间都是相同的。

感谢所有回复的人。所有的观点都很好,我只是不能说其中任何一个已经解决了问题。

最佳答案

还有很多其他因素,但我真的猜测您正在快速生成 30-40 个进程,每个进程使用 30M 左右,并杀死机器有限的内存,然后继续生成新进程并进行交换,减慢速度一切都下来了。

如果内存为 2G,MaxClients 为 150,MaxRequestsPerChild 为 0,即使您的数据库不在同一台物理服务器上,服务器资源也可能会被淹没。

基本上,对于 Web 服务器性能,您不想进行交换。运行测试,然后立即使用以下命令检查 Web 服务器上的内存:

free -m

这将为您提供内存使用情况(以 MB 为单位)和交换使用情况。理想情况下,您应该看到交换为 0 或接近 0。如果不是零或交换使用率非常低,则问题只是内存耗尽,您的服务器正在抖动,因此浪费了 CPU,导致响应时间缓慢。

您需要获得一些数字才能确定,但​​首先执行“top”并在 top 运行时按 Shift-M 以按内存排序。下次运行测试时,您会发现每个 httpd 进程报告的 %MEM 数量的大致数字。它会有所不同,因此最好使用较高的值作为最坏情况的指导。我在同一台服务器上有一个 wordpress、一个 drupal 和一个 customere 站点,它们从一开始就定期为每个 http 进程分配 20M,并最终随着时间的推移而向上增长——如果不检查的话,每个进程都会超过 100M。

从我的屁股里拉出一些数字,例如,如果我有 2G 和 linux,核心服务,并且 mysql 使用 800M,我会保持对可用于 Apache fun 的内存的期望低于 1G 。这样,如果我的 apache 进程平均使用 20M 的高端,我只能有 50 个 MaxClient。这是一个非常不保守的数字,在现实生活中,为了安全起见,我会将 Max 降至 40 左右。不要试图压缩内存...如果您提供足够的流量以支持 40 个同时连接,请先花 100 美元升级到 4G,然后再升级 Max 服务器。这是其中之一,一旦你越过界限,一切都会消失,所以请安全地保持在你的内存限制范围内!

此外,对于 php,我喜欢将 MaxRequestsPerChild 保持在 100 左右...您不会受 CPU 限制来提供网页,因此不必担心会节省几毫秒的时间来生成新的子进程。将其设置为 0 意味着无限制的请求,并且除非客户端总数超过 MaxSpareServers,否则它们永远不会被终止。对于使用 apache 工作线程的 php 来说,这通常是一件非常糟糕的事情,因为它们会不断增长,直到发生坏事(比如必须硬重启你的服务器,因为你无法登录,因为 apache 耗尽了所有内存,并且ssh 在没有超时的情况下无法工作)。

祝你好运!

关于PHP 生成页面,但不会立即将其返回给用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6156244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com