我希望了解我在(对我们而言)负载较重的 Web 服务器上看到的一些服务器性能问题。环境如下:
我们看到的行为是,网络通常感觉是响应式的,但开始处理请求会有轻微的延迟——有时是几分之一秒,有时是我们高峰使用时间的 2-3 秒。服务器上的实际负载报告为非常高 - 通常为 10.xx 或 20.xx,如top. 此外,在这些时间(甚至vi)在服务器上运行其他东西非常慢,所以负载肯定在那里。奇怪的是 Apache 仍然非常敏感,除了最初的延迟。
我们使用 prefork 将 Apache 配置如下:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
Run Code Online (Sandbox Code Playgroud)
和 KeepAlive 为:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
Run Code Online (Sandbox Code Playgroud)
查看服务器状态页面,即使在这些负载很重的时候,我们也很少达到客户端上限,通常处理 80-100 个请求,其中许多请求处于保持活动状态。这告诉我将初始请求缓慢排除为“等待处理程序”,但我可能错了。
Amazon 的 CloudWatch 监控告诉我,即使我们的操作系统报告的负载大于 15,我们的实例 CPU 利用率也在 75-80% 之间。
示例输出top:
top - 15:47:06 up 31 days, 1:38, 8 users, load average: 11.46, …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 bash 脚本中执行以下操作,并且想知道是否有可能:
time这是一个复杂的链,我没有太多运气让它一起工作。如果我停止使用时间,我可以获得状态代码。
这是我到目前为止所拥有的:
# the setup
TIMEFORMAT=%R
MYSQL=mysql <options>
# execute and time a query (does more than is listed here)
function executeQuery {
TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null ) 2>&1 )
# do something with $?
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 tee 将命令中的任何错误响应重定向到文件,然后将生成的 stdout 发送到 /dev/null。然后我将时间命令的 stderr 重定向到 stdout,它应该以 $TIME 结束。
现在,如果我将该行更改为:
TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null; exit ${PIPESTATUS[0]} …Run Code Online (Sandbox Code Playgroud)