我们有一个 Thin + RoR,带有 ActiveRecord + memcached + Postgres 应用程序,它使用 pg gem 访问 Postgres 数据库。
我们观察到,在高负载下,精简进程会突然变得无响应,并且在负载减弱时永远不会恢复。与此同时,我们的数据库服务器运行良好——我们可以查询数据并在预期的时间内获得响应。
我们观察到的事情:
- 在进入不良状态之前,我们并没有看到响应时间缓慢增加 - 转变是突然的。
- 我们可以通过一个或多个精简进程进入该状态,这似乎消除了它们在负载下相互死锁的可能性。
- 当负载减弱时,精简进程不会恢复并继续无响应。
- 一旦挂起,瘦进程似乎不会向数据库发出任何请求。
- gdp 指出,当处于挂起状态时,我们有处于 sleep_forever 状态的瘦线程:0x00007f75c78c85d2 in sleep_forever (arg=) at thread.c:848
请记住,这是 95% 的读取应用程序,具有或多或少的积极缓存策略(即我们没有可能导致死锁的数据库事务),我们正在寻找有关在哪里查找的建议。
非常感谢您的帮助!额外信息:
gem :
- gem“rails”,“2.3.11”
- gem “薄”,“1.2.7”
- gem 'pg'
环境:
- psql(PostgreSQL)9.1.2
- 精简1.2.7
- ruby 1.9.2-p290
- Rails 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
最佳答案
这是 ruby 中 TCP 堆栈的问题: http://bugs.ruby-lang.org/issues/5343
尝试升级到 ruby 1.9.3 或更高版本。
关于ruby-on-rails - 高负载下薄悬挂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9384273/