Я запускаю CF 9.0.1 на Ubuntu на экземпляре "Средний" Amazon EC2. 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
В администраторе в разделе "Настройки сервера" > "Запросить настройку" параметр Максимальное количество одновременных запросов Шаблона - 25. Таким образом, это имеет смысл до сих пор. Я мог бы просто увеличить пул потоков, чтобы покрыть подобные всплески нагрузки. Я мог бы сделать это 200. (Что я сделал сейчас как тест.)
Однако есть и этот файл /opt/coldfusion 9/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>
Какой а) имеет меньше активных потоков (что это значит?) и b) имеет максимальные потоки, которые превышают ограничение на одновременный запрос, установленный администратором. Итак, я не уверен. Нужны ли эти независимые конфигурации, чтобы они соответствовали друг другу? Или файл jrun.xml должен быть написан администратором CF при внесении изменений? Хм. Но, возможно, это отличается от того, что, возможно, 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 просто рухнул снова (скорее, он провалился и запросы начали отсчет времени... так эффективно "разбился" ). На этот раз топ выглядел похожим (все еще потребляющим более 99% процессора), но статус 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
Итак, ясно, что увеличение максимальных одновременных запросов не помогло. Я догадываюсь, что это такое: с чем это связано? Откуда берутся эти шипы? Всплески трафика? На каких страницах? Какие запросы выполняются в любой момент времени? Думаю, мне просто нужно больше информации для продолжения поиска и устранения неисправностей. Если есть длительные запросы или другие проблемы, я не вижу их в журналах (хотя у меня есть эта опция, отмеченная администратором). Мне нужно знать, какие именно запросы отвечают за эти шипы. Любая помощь приветствуется. Спасибо.
~ день