【问题标题】:Thin hanging under high load高负载下薄挂
【发布时间】:2012-02-21 19:59:16
【问题描述】:
我们有一个带有 ActiveRecord + memcached + Postgres 的 Thin + RoR 应用程序,它使用 pg gem 来访问 Postgres 数据库。
我们观察到,在高负载下,瘦进程会突然变得一个一个无响应,并且在负载消退时永远不会恢复。与此同时,我们的数据库服务器运行良好——我们可以查询数据并在预期时间内得到响应。
我们观察到的事情:
- 在我们进入不良状态之前,我们没有看到响应时间缓慢增加 - 过渡是突然的。
- 我们可以通过一个或多个瘦进程进入该状态,这似乎消除了它们在负载下相互死锁的可能性。
- 当负载减轻时,精简进程不会恢复并继续无响应。
- 一旦挂起,瘦进程似乎不会向数据库发出任何请求。
- gdp 指出,当处于挂起状态时,我们有处于 sleep_forever 状态的瘦线程:0x00007f75c78c85d2 in sleep_forever (arg=) at thread.c:848
请记住,这是 95% 的读取应用程序,具有或多或少的激进缓存策略(即我们没有可能导致死锁的数据库事务),我们正在寻找有关在哪里查找的建议。
非常感谢您的帮助!额外信息:
宝石:
- gem 'rails', '2.3.11'
- gem '薄','1.2.7'
- 宝石'pg'
环境:
- psql (PostgreSQL) 9.1.2
- 瘦1.2.7
- Ruby 1.9.2-p290
- Rails 2.3.11
- Apache 2.2.14(详情如下)
服务器版本:Apache/2.2.14 (Ubuntu)
服务器建成时间:2012 年 2 月 14 日 16:42:27
服务器模块幻数:20051115:23
服务器加载:APR 1.3.8,APR-Util 1.3.9
编译使用:APR 1.3.8、APR-Util 1.3.9
架构:64位
服务器 MPM:工作者
线程:是(固定线程数)
分叉:是(可变进程计数)
服务器编译...
-D APACHE_MPM_DIR="服务器/mpm/worker"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6(启用 IPv4 映射地址)
-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="日志/错误日志"
-D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"
root@a17:~# /usr/sbin/apache2 -v
服务器版本:Apache/2.2.14 (Ubuntu)
服务器建成:2012年2月14日16:42:27
【问题讨论】:
标签:
ruby-on-rails
postgresql
load
thin