10

我在“中”Amazon EC2 实例上的 Ubuntu 上运行 CF 9.0.1。CF 一直在间歇性地占用(每天几次......但特别是不孤立于高峰使用时间)。在这种时候,运行top让我得到这个(或类似的东西):

PID     USER    PR  NI  VIRT    RES     SHR S   %CPU    %MEM    TIME+COMMAND
15855   wwwrun  20  0   1762m   730m    20m S   99.3    19.4    13:22.96 coldfusion9

因此,它显然消耗了大部分服务器资源。在每次占用之前,我的 cfserver.log 中都出现了以下错误:

java.lang.RuntimeException: Request timed out waiting for an available thread to run. You may want to consider increasing the number of active threads in the thread pool.

如果我运行/opt/coldfusion9/bin/coldfusion status,我会得到:

Pg/Sec  DB/Sec  CP/Sec  Reqs  Reqs  Reqs  AvgQ   AvgReq AvgDB  Bytes  Bytes 
Now Hi  Now Hi  Now Hi  Q'ed  Run'g TO'ed Time   Time   Time   In/Sec Out/Sec
0   0   0   0   -1  -1  150   25    0     0      -1352560      0      0

在管理员中,在Server Settings > Request Tuning下,同时模板请求的最大数量设置为25。所以到目前为止这是有意义的。我可以增加线程池来覆盖这些负载峰值。我可以做到 200。(我刚才做了测试。)

但是,还有这个文件/opt/coldfusion9/runtime/servers/coldfusion/SERVER-INF/jrun.xml。那里的一些设置似乎有冲突。例如,它写道:

<service class="jrunx.scheduler.SchedulerService" name="SchedulerService">
  <attribute name="bindToJNDI">true</attribute>
  <attribute name="activeHandlerThreads">25</attribute>
  <attribute name="maxHandlerThreads">1000</attribute>
  <attribute name="minHandlerThreads">20</attribute>
  <attribute name="threadWaitTimeout">180</attribute>
  <attribute name="timeout">600</attribute>
</service>

哪个 a) 具有较少的活动线程(这是什么意思?),和 b) 具有超过管理员中设置的同时请求限制的最大线程。所以,我不确定。这些独立的配置需要手动匹配吗?还是在进行更改时应该由 CF 管理员编写jrun.xml文件?唔。但也许这是不同的,因为大概 CF 调度程序应该只使用所有可用线程的一个子集,对吧?...所以我们总是有一些线程供真实用户使用?我们也有这个:

<service class="jrun.servlet.http.WebService" name="WebService">
  <attribute name="port">8500</attribute>
  <attribute name="interface">*</attribute>
  <attribute name="deactivated">true</attribute>
  <attribute name="activeHandlerThreads">200</attribute>
  <attribute name="minHandlerThreads">1</attribute>
  <attribute name="maxHandlerThreads">1000</attribute>
  <attribute name="mapCheck">0</attribute>
  <attribute name="threadWaitTimeout">300</attribute>
  <attribute name="backlog">500</attribute>
  <attribute name="timeout">300</attribute>
</service>

当我更改 CF Admin 设置时,这似乎已经改变......也许......但它是与我的新最大同时请求设置匹配的activeHandlerThreads ......而不是maxHandlerThreads,它再次超过了它。最后,我们有这个:

<service class="jrun.servlet.jrpp.JRunProxyService" name="ProxyService">
  <attribute name="activeHandlerThreads">200</attribute>
  <attribute name="minHandlerThreads">1</attribute>
  <attribute name="maxHandlerThreads">1000</attribute>
  <attribute name="mapCheck">0</attribute>
  <attribute name="threadWaitTimeout">300</attribute>
  <attribute name="backlog">500</attribute>
  <attribute name="deactivated">false</attribute>
  <attribute name="interface">*</attribute>
  <attribute name="port">51800</attribute>
  <attribute name="timeout">300</attribute>
  <attribute name="cacheRealPath">true</attribute>
</service>

所以,我不确定我应该更改哪些(如果有的话)以及最大请求和最大线程之间的确切关系。此外,由于其中几个将maxHandlerThreads列为 1000,我想知道是否应该将最大同时请求数设置为 1000。必须有一些上限取决于可用的服务器资源......但我不确定是什么它是,我真的不想玩它,因为它是一个生产环境。

我不确定它是否与这个问题有关,但是当我运行ps aux | grep Coldfusion我得到以下信息:

wwwrun   15853  0.0  0.0   8704    760    pts/1     S   20:22   0:00 /opt/coldfusion9/runtime/bin/coldfusion9 -jar jrun.jar -autorestart -start coldfusion
wwwrun   15855  5.4 18.2   1678552 701932 pts/1     Sl  20:22   1:38 /opt/coldfusion9/runtime/bin/coldfusion9 -jar jrun.jar -start coldfusion

总是有这两个,永远不会超过这两个过程。因此,进程和线程之间似乎没有一对一的关系。我记得在我维护多年的 MX 6.1 安装中,在进程列表中可以看到额外的 CF 进程。当时在我看来,每个线程都有一个进程......所以要么我错了,要么版本 9 中的某些东西完全不同,因为它报告了 25 个正在运行的请求并且只显示这两个进程。如果单个进程可以在后台有多个线程,那么我会想知道为什么我有两个进程而不是一个?...只是好奇。

所以,无论如何,我在撰写这篇文章时一直在尝试。如上所述,我将最大同时请求数调整为 200。我希望这能解决我的问题,但 CF 再次崩溃(相反,它停滞不前并且请求开始超时......所以有效地“崩溃”了)。这一次,top 看起来很相似(仍然消耗超过 99% 的 CPU),但 CF 状态看起来不同:

Pg/Sec  DB/Sec  CP/Sec  Reqs  Reqs  Reqs  AvgQ   AvgReq AvgDB  Bytes  Bytes
Now Hi  Now Hi  Now Hi  Q'ed  Run'g TO'ed Time   Time   Time   In/Sec Out/Sec
0   0   0   0   -1  -1  0     150   0     0      0      0      0      0

显然,由于我增加了最大同时请求数,它允许更多请求同时运行……但它仍然使服务器资源最大化。

进一步的实验(重新启动 CF 后)向我表明,在大约 30-35 个“Reqs Run'g”之后,服务器变得无法使用,所有额外的请求都不可避免地超时:

Pg/Sec  DB/Sec  CP/Sec  Reqs  Reqs  Reqs  AvgQ   AvgReq AvgDB  Bytes  Bytes
Now Hi  Now Hi  Now Hi  Q'ed  Run'g TO'ed Time   Time   Time   In/Sec Out/Sec
0   0   0   0   -1  -1  0     33    0     0      -492   0      0      0

因此,很明显,增加最大同时请求数并没有帮助。我想归根结底是这样的:它有什么困难?这些尖峰来自哪里?流量爆发?在哪些页面上?在任何给定时间正在运行哪些请求?我想我只需要更多信息来继续故障排除。如果有长时间运行的请求或其他问题,我不会在日志中看到它(尽管我确实在管理员中选中了该选项)。我需要知道哪些请求正是导致这些峰值的那些请求。任何帮助将非常感激。谢谢。

〜日

4

5 回答 5

5

我有许多“生产中的高 CPU”类型的错误,我一直处理它们的方式是这样的:

  1. 使用jstack PID >> stack.log 转储 5 个堆栈跟踪,间隔 5 秒。走线数量和时序并不重要。

  2. 在Samurai中打开日志。每次进行转储时,您都会看到线程的视图。处理您的代码的线程启动 web-(用于使用内置服务器的请求)和 jrpp- 用于通过 Apache/IIS 进入的请求。

  3. 阅读每个线程的历史。您正在寻找每个转储中非常相似的堆栈。如果一个线程看起来一直在处理同一个请求,那么在顶部附近变化的位将指向发生无限循环的位置。

随意在网上某处转储堆栈跟踪并将我们指向它。

我用来了解发生了什么的另一种技术是修改 apache 的 httpd.conf 以记录所用时间:%D 并记录会话 id:%{jsessionid},它允许您在启动过程中跟踪单个用户挂起和用数据做一些漂亮的统计/图表(我使用LogParser处理数字并输出到 CSV,然后使用 Excel 来绘制数据):

LogFormat "%h %l %u %t "%r" %>s %b %D %{jsessionid}" customAnalysis
CustomLog logs/analysis_log customAnalysis

我刚刚记得的另一种技术是启用CF Metrics,它可以让您了解服务器在挂起时的运行状况。我将其设置为每 10 秒记录一次并将格式更改为 CSV,因此我可以从事件日志中 grep 指标,然后通过 Excel 运行它们以在崩溃前绘制服务器负载图。

巴尼

于 2012-06-06T07:30:14.587 回答
2

要找出使您的 procs 最大化的原因,需要大量系统“内部”的信息。从外部查看排队请求等内容很难做到这一点。有一件事是肯定的 - 将同时请求设置更改为非常高的数字不会起到作用:)它所要做的就是删除旨在保留的东西CF免于对过多的处理器感到沮丧。

这是我列出的最大程度利用 CPU 的事情。

  • 注册表中的客户端变量。我有几篇关于为什么这个问题会突然“突然出现”的优秀文章。查看我的博客(coldfusion 缪斯)。
  • 连接到数据库的间歇性问题。这实际上在云中有点恶化,其中网络和带宽使用限制可能会“限制”与数据库的连接。大多数 CF 应用程序大量使用数据库。如果某些东西干扰或减慢连接,结果是连接数会上升,直到达到该同时数,然后请求开始排队 - 但这个问题不一定与 CF 本身有关 - 这是一个症状。
  • JVM 问题 - 调整你的 JVM 来处理垃圾收集,有足够的 New 和 Perm gen 空间等是非常重要的......虽然坦率地说,上面的项目通常是第一个出错的。

发生这种情况还有许多其他原因 - 其中(如您所料)在某些脚本运行时出现的代码问题。长时间运行的请求、文件上传、繁重的计划任务、索引 bot 流量生成流量或产生太多会话……不胜枚举。

希望我提供的这份清单上的一些东西会尽可能地打动你。祝你好运。

(是的,FR 甚至 CF 监视器都是帮助您梳理这一切的好工具:)。

于 2012-06-06T03:15:21.120 回答
0

几周前,我有一个服务器在 JRun 进程上不断地最大化 CPU 利用率,并会定期重新启动它,只是让它在 24 小时内恢复到 100%。我也对 JVM 设置等大惊小怪,直到最后发现,令我尴尬的是,我的代码中有一个无限循环。有一个 WHILE 循环,其条件永远不会满足。哎呀。

所以也许你在你的代码中犯了一个简单的错误,它与服务器配置无关,fwiw。

+1 用于 FusionReactor 演示。这至少会给你一些线索。

于 2012-06-05T21:38:15.750 回答
0

您将不得不增加活动线程池的大小。请检查以下链接

http://www.talkingtree.com/blog/index.cfm/2005/11/28/Request-timed-out-waiting-for-an-available-thread-to-run

http://helpx.adobe.com/coldfusion/kb/coldfusion-mx-6-1-request.html

快乐编码!!!

于 2012-06-06T12:31:02.393 回答
0

您是否尝试过使用 ColdFusion 附带的 ColdFusion Server 监视器?

于 2013-12-30T00:59:12.053 回答