У нас есть Thin + RoR с приложением ActiveRecord + memcached + Postgres, которое использует гем pg для доступа к базе данных Postgres.
Мы наблюдаем, что при высокой нагрузке тонкие процессы внезапно перестают отвечать на запросы иникогда не восстанавливаться, когда нагрузка уменьшается.Тем временем наш сервер баз данных работает хорошо - мы можем запрашивать данные и получать ответы в ожидаемое время.
Вещи, которые мы наблюдали:
- Мы не видим медленного увеличения времени отклика, прежде чем попадем в плохое состояние - переход внезапный.
- Мы можемвойти в это состояние с одним или несколькими тонкими процессами, что, по-видимому, исключает возможность их взаимной блокировки под нагрузкой.
- Когда нагрузка спадает, тонкие процессы не восстанавливаются и продолжают не отвечать.
- После зависания тонкий процесс, похоже, не выдает никаких запросов к БД.
- gdp указывает, что в состоянии зависания у нас есть тонкие нити в состоянии sleep_forever: 0x00007f75c78c85d2 в sleep_forever (arg =) в thread.c: 848
Помня о том, чтоЭто 95% читаемое приложение с более или менее агрессивной стратегией кэширования (т.е. у нас нет транзакций с базой данных, которые могут вызвать взаимные блокировки), мы ищем предложения о том, где искать.
Большое спасибо за вашу помощь!Дополнительная информация:
Драгоценные камни:
- драгоценный камень 'рельсы', '2.3.11'
- драгоценный камень 'тонкий', '1.2.7'
- gem 'pg'
Среда:
- psql (PostgreSQL) 9.1.2
- Тонкий 1.2.7
- Рубин1.9.2-p290
- Рельсы 2.3.11
- Apache 2.2.14 (подробности ниже)
Server version: Apache/2.2.14 (Ubuntu)
Server built: Feb 14 2012 16:42:27
Server's Module Magic Number: 20051115:23
Server loaded: APR 1.3.8, APR-Util 1.3.9
Compiled using: APR 1.3.8, APR-Util 1.3.9
Architecture: 64-bit
Server MPM: Worker
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/worker"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT=""
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"
root@a17:~# /usr/sbin/apache2 -v
Server version: Apache/2.2.14 (Ubuntu)
Server built: Feb 14 2012 16:42:27