ruby-on-rails - 高负载下薄悬挂

标签 ruby-on-rails postgresql load thin

我们有一个 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/

相关文章:

javascript - 如何调试我的代码 Ruby、Javascript、CSS?

java - 使用 pdfbox 在现有表单 pdf 上写入

ruby-on-rails - 种子数据字符串中的换行符

postgresql - 从 Postgres 的 jsonb 中选择匹配元素

PostgreSQL bigserial 和 nextval

sql - 从大字符串中查找特定字符串的所有位置

python - 导入 Python 模块时 __package__ 为 None

r - Microsoft Azure ML 中的插入符包

ruby-on-rails - 如何使用 rspec 和 factory girl 创建具有特定 id 的模型

ruby-on-rails - 在 docker 容器中运行 Rails 应用程序