我们有一个使用pg gem访问Postgres数据库的ActiveRecord + memcached + Postgres应用程序的Thin + RoR。在高负载下轻薄挂起
我们注意到,在高负载下,细过程突然变得无法响应,并且在负载消退时无法恢复。与此同时,我们的数据库服务器运行良好 - 我们可以查询数据并在预期时间内得到响应。
事情我们已经观察到:
- 我们没有看到在响应时间缓慢增加之前,我们在一个糟糕的状态让 - 的过渡是突然的。
- 我们可以用一个或多个细化进程进入该状态,这似乎消除了它们在负载下彼此死锁的可能性。
- 当负载消退时,精简进程不会恢复,并继续无响应。
- 一旦挂起,精简进程似乎不会向数据库发出任何请求。
- GDP指出,当在挂起状态,我们在sleep_forever状态细线:在thread.c 0x00007f75c78c85d2在sleep_forever(ARG =):848
铭记,这是95%的读取应用程序采用或多或少积极的缓存策略(即我们没有可能导致死锁的数据库事务),我们正在寻找关于在哪里寻找的建议。
非常感谢您的帮助!额外的信息:
宝石:
- 宝石 '轨道', '2.3.11'
- 宝石 '薄', '1.2.7'
- 宝石 'PG'
环境:
- PSQL(PostgreSQL的)9.1.2
- 薄1.2.7
- 红宝石1.9.2-P290
- 滑轨2.3.11
- 阿帕奇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" [email protected]:~# /usr/sbin/apache2 -v Server version: Apache/2.2.14 (Ubuntu) Server built: Feb 14 2012 16:42:27
非常感谢。这看起来非常相关 - 堆栈跟踪是相同的 - 但是在我们升级ti 1.9.3之后,问题仍然存在。 – 2012-02-22 01:14:35
我们最终从瘦身换成了独角兽,完全避免了这种情况 - 也许它在1.9.3中仍然是个问题? – Brett 2012-02-23 17:53:02
这实际上正是我们最终做的。我们切换到独角兽,这个问题不再为我们重新审视。 – 2012-02-25 00:34:34