我们仍然需要来自 ISW 的旧的基于 WebSphere 的 Kudos Boards。用户反映 ajax 操作,如设置截止日期或卡片中的负责人非常慢,有些甚至在完成之前中止。到目前为止,我在这里看不到为什么会发生这种情况的模式。它似乎与特定用户或客户端无关。
如何解决这个问题?我想退后一步,先衡量一下处理请求需要多长时间。然后生成一个处理时间超过特定时间的所有请求的列表,比如说超过一秒。所以我们知道有多少用户受到了影响,他们之间可能有一些共享的东西,比如网络慢的用户或类似的东西。
我们仍然需要来自 ISW 的旧的基于 WebSphere 的 Kudos Boards。用户反映 ajax 操作,如设置截止日期或卡片中的负责人非常慢,有些甚至在完成之前中止。到目前为止,我在这里看不到为什么会发生这种情况的模式。它似乎与特定用户或客户端无关。
如何解决这个问题?我想退后一步,先衡量一下处理请求需要多长时间。然后生成一个处理时间超过特定时间的所有请求的列表,比如说超过一秒。所以我们知道有多少用户受到了影响,他们之间可能有一些共享的东西,比如网络慢的用户或类似的东西。
Apache 模块mod_log_config允许记录某些属性。有趣的是%T
:
处理请求所花费的时间,以秒为单位。
使用该%{UNIT}T
格式,它可以以微秒而不是秒为单位显示,这更便于以后分析。所以我扩展了常用的日志格式,把处理时间先写在conf/httpd.conf
:
LogFormat "%{ms}T %h %l %u %t \"%r\" %>s %b" common
另一个好主意是也添加 User-Agent,它提供了有关客户端类型的一些信息:
LogFormat "%{ms}T %h %l %u %t \"%r\" %>s %b \"%{User-Agent}i\"" common
首先检查配置文件以确保我们没有破坏任何东西:
/opt/IBM/HTTPServer #./bin/apachectl -t
Syntax OK
现在我们可以在生产环境中优雅地重新启动。这样,网络服务器在应用我们的新配置之前完成所有当前处理的请求。与硬重启相反,大多数用户甚至不应该知道我们重启了他们的网络服务器。
./bin/apachectl -k graceful
所有新请求都以毫秒为单位记录持续时间,如下所示:
100007 1.2.3.4 - - [03/Nov/2020:14:29:52 +0100] "POST /push/form/comet/connect HTTP/1.1" 200 96 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0"
我们现在一天就有数百 MB 的日志。需要一个过滤器才能从中获取有用的信息。在查看日志时,我们需要做两件事来从它们那里获取有关慢速请求的信息:
为此,我编写了以下命令:
log=/tmp/access-slow.log; egrep -i -v "(POST /(push|files)/|GET /(kudosboards/updates|api-boards)/|\.mp4(\?[A-Za-z0-9_\-=&]+)? HTTP)" logs/access_2020_11_03.log | egrep '^[0-9]{4,}' | sort -rnk1 > $log; wc -l $log
第一个egrep
调用过滤掉所有在这里不感兴趣的请求:/push
来自长期保持活动连接,kudos 也这样做。我还排除了 mp4 电影,因为这些文件自然很大。当下载一部 500MB 的电影需要一些时间时,我们无需担心。有时我也看到它们带有 GET 参数,movie.mp4?logDownload=true&downloadType=view
所以它们也被过滤了。
egrep '^[0-9]{4,}'
整理处理时间少于 4 位的请求,这基本上意味着 >= 1000 毫秒。由于我正在寻找严重的性能问题,这似乎是一个很好的起点。
sort -rnk
按持续时间降序排列我们的日志,所以我们在开始时有最慢的条目。
wc -l $log
只是想知道我们这次收集了多少慢条目。现在可以使用less $log
. 我们拥有超过 200 万个条目的大型访问日志减少到 2k。