- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在测试我正在组装的服务器设置的负载能力。 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/
我希望在我的应用程序下载信息时显示 Toast 消息,但即使我将它放在我的代码之前,它也不会在下载完成后出现。将我的代码放在一个单独的线程中会引起很多麻烦,但是将 toast 放在一个单独的线程中也不
面临即时应用更新模式的问题。成功完成应用程序更新后,一切都关闭并且不重新启动应用程序。这就是问题所在。 但是android文档说: A full screen user experience that
我有一张 table 我有一个 anchor 标记,
我正在开发一个具有两个线程的 Java/Seam/Hibernate/Glassfish 应用程序: 线程 #1 发送各种消息并将摘要信息写入 MySQL 数据库。 线程 #2 定期轮询数据库(由 S
我找不到规范的相关部分来回答这个问题。在 Java 中的条件运算符语句中,是否同时评估真假参数? 以下是否会抛出 NullPointerException Integer test = null; t
大家下午好, 我想知道是否有办法使类的静态 block 运行,即使类本身没有被引用? 我知道它是延迟加载的,因此只需调用该类的任何函数即可开始启动该类, 但是,我希望该类在任何调用之前启动,换句话说,
我正在尝试使用 jQuery prop() 方法禁用元素(表单字段)。有两个字段,一个叫做fee,一个叫做currency。每当 fee 设置为 0 时,第二个字段 currency 将被禁用。这样做
我想为 UIButton 的缩放设置动画,并在完成后再次为缩放设置动画,但让它在没有动画的情况下旋转。我尝试将旋转变换放在没有持续时间的动画调用中,但不知何故它仍然成为缩放动画的一部分或替换缩放动画。
在 js 代码中,我创建了 3 个按钮 --- 按钮 1...按钮 2...按钮 3和 3 个输入字段 --- 输入字段 1...输入字段 2...输入字段 3 从脚本开始所有按钮都被禁用 只有当输入
我正在使用一个 threading.Thread() 来完成它的工作并返回 。它的返回记录在打印语句中,所以我确信有时候是这样的。然而,依靠 threading.active_count() 和 th
我正在使用 IntelliJ 9,我很好奇是否有任何与 Visual Studio“即时”调试窗口等效的 IntelliJ。在编辑器中选择所需的表达式,然后 ALT-F8 来评估表达式,但我希望能够在
我有一个两个标签页,一个标签是记录列表,点击记录会切换到编辑标签,编辑标签中有保存和取消按钮。 现在,我单击记录 #1,进行一些编辑,然后单击取消按钮。当然我不想验证表单,因为它被取消了,所以我设置了
我有一个 A viewController,首先,我呈现 B viewController,经过一些工作后,我需要关闭 B viewController 并呈现 C viewController,所以
我希望能够在文本框中输入内容,当用户在文本框中输入内容时,我希望程序无需单击按钮即可自动读取文本框。 例子:用户类型:“abcd”当用户输入时,程序会显示每个字母对应的数字。 程序输出:“1234”
如果任何表单输入发生更改,如何立即更改提交按钮文本? //This applies to whole form $('#test').change(function() { $("#send").
主要功能: var interval; function refreshId(sessio
假设我有一个包含这些列的 data.table nodeID hour1aaa hour1bbb hour1ccc hour2aaa hour2bbb hour2ccc .
根据vimeo js-api doc ,事件 finish - 当视频播放结束时触发。 出于某种原因,我无法让它工作,finish 事件总是立即调用,我做错了什么吗? 我试图让嵌入的视频在播放完毕后消
我想滑动当前ul元素下的所有li元素和slideDown li元素 $(document).ready(function(){ $("li").slideUp(); }); $(".nav")
我有一个表-compositeView,其中有行-itemView。每行都有许多事件 - 单击、更改等等。 在某些状态下,我想“锁定”表。禁用按钮并取消事件。 是否有一种好方法可以立即取消 itemv
我是一名优秀的程序员,十分优秀!