我正在一个非虚拟的64位ubuntu 11.04系统上运行一个小型社区(6000多个成员)。
我不是一个Linux专业版,甚至没有先进的,我只是试图build立一个networking服务器,其实并没有什么特别的。 提供一些dynamic的PHP和RoR网站是它的任务。 所以这可能是我的configuration文件看起来糟透了。 此外,我可能会使用错误的词汇,所以有疑问,请问。
目前有520个注册用户(董事会帐户,没有系统用户)同时在线的历史logging,平均服务器负载约为2.0 – 5.0。 同时(〜250个用户)的平均服务器负载值约为0.4 – 0.8,有时在一些昂贵的search上有点高。 一切都很好。
然而,不时地,负载增加到120(120.0,不是12.0;))。 在这个时候,它甚至难以通过SSH连接,但是当我到达服务器,并使用top / htop / iotop来查看发生了什么事情时,我无法识别任何导致高CPU负载的进程。
iotop告诉我目前的读/写速度约为。 70kb / s,这相当于我认为的断电。
内存使用量最大。 在〜12GB的16GB,所以交换空置。
现在奇怪(至less对我来说:))
等待几分钟(因为当发生这种情况时,我总是会有点恐慌,感觉像5分钟,但是我想它更像是20-30分钟),服务器恢复正常。 一切正常。
另一个奇怪的事实
当我运行hdparm -tT / dev / sda时,我得到如下的答案:
/dev/sda: Timing cached reads: 7180 MB in 2.00 seconds = 3591.13 MB/sec Timing buffered disk reads: 348 MB in 3.02 seconds = 115.41 MB/sec
当我在服务器“冻结”时运行相同的命令,答案就像
/dev/sda: <- takes about 5 minutes until this line appears Timing cached reads: 7180 MB in 2.00 seconds = 3591.13 MB/sec <- 5 more minutes Timing buffered disk reads: 348 MB in 3.02 seconds = 115.41 MB/sec <- another 5 minutes
所以价值是一样的,但引用的时间是完全错误的。 使用时间命令作为前缀也告诉我~15分钟被使用。
我在dmesg,/ var / log / [messages | syslog]中search过 – 没有发现任何东西。
/ var / log /错误告诉我:
Jul 4 20:28:30 localhost kernel:[19080.671415]信息:任务php5-fpm:27728被阻塞超过120秒。 7月4日20:28:30 localhost内核:[19080.671419]“echo 0> / proc / sys / kernel / hung_task_timeout_secs”禁用此消息。
多次。 现在这个消息告诉我,php5-fpm任务被阻止或阻止? – 但是,如果这是“冻结”的原因或结果之一,则不是这样。 任何人?
长话短说,我不知道哪里开始分析。 所以,如果你可以给我任何build议,看看下面的规格和configuration,或要求我提供更多的信息,我会很高兴。
眼镜:
6核心AMD Phenom(tm)II X6 1055T处理器*
16千兆字节的RAM
2个1.5 TB的希捷ST1500DL003-9VT16L通过SATA 3通过SoftwareRaid(我想)
服务:(由于服务 - 状态 - 所有,那些与[+])
nginx Webserver 1.0.14
MySQL 5.1.63服务器
Ruby on Rails 2.3.11(passenger-nginx-module)
php5-fpm 5.3.6-13ubuntu3.7
SSH
ido2db
其他服务:
默认crontab +每晚备份。
syslog-ng的
网站由2个子域名,论坛组成。 和www。 其中论坛是phpBB3.x PHP-Board,以及www一个Ruby on Rails 2.3.11应用程序(门户)。
迷你笔记:有时我注意到论坛相当缓慢,而不是“快速”(除了这个“冻结”)入口。 两者共享相同的数据库,但门户网站只读使用它。
Web服务器是nginx,使用phusion乘客模块与ruby应用程序进行通信。 另外,对于论坛,它通过套接字与php5-fpm进行通信:
相关的nginxconfiguration部分(带有以…开头的注释/问题)
; 如果由于文件系统活动过高而导致冻结,可能会添加一个限制?
#worker_rlimit_nofile 50000;
用户www-data;
; 6个核心,所以我读了6个适合。 也许已经错了?
worker_processes 6;
pid /var/run/nginx.pid;
事件{
worker_connections 1024;
}
http {
passenger_root /var/lib/gems/1.8/gems/passenger-3.0.11;
passenger_ruby /usr/bin/ruby1.8;
; 该论坛曾经有一个聊天function,这个聊天function没有websockets。
; 所以这是一个拉地狱的要求(现在停用,冻结仍然发生)
keepalive_timeout 65;
keepalive_requests 50;
gzip on;
服务器{
听80;
server_name www.domain.tld;
root / var / www / domain / rails / public;
passenger_enabled;
}
服务器{
听80;
server_name forum.domain.tld;
位置 / {
root / var / www / domain / forum;
index index.php;
}
; satic的东西要由nginx处理
位置〜* ^ / style /.+。(jpg | jpeg | gif | css | png | js | ico | xml)$ {
access_logclosures;
到期30天;
root / var / www / domain / forum /;
}
; 现在的PHP魔术,注意“后端”-fcgi_pass
位置〜.php $ {
fastcgi_split_path_info ^(。+ \。php)(。*)$;
fastcgi_pass后端;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME / var / www / domain / forum $ fastcgi_script_name;
包括fastcgi_params;
fastcgi_param QUERY_STRING $ query_string;
fastcgi_param REQUEST_METHOD $ request_method;
fastcgi_param CONTENT_TYPE $ content_type;
fastcgi_param CONTENT_LENGTH $ content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abortclosures;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_max_temp_file_size 0;
}
location〜/\.ht {
否认一切;
}
}
; php5-fpm套接字。 我读到/ dev / shm /应该是这个的fastes地方。 一般的坏主意?
上游后端{
server unix:/ dev / shm / phpfpm;
}
...
}
php5-fpm设置(由于php5-fpm错误日志消息越来越高,我改变了这个值..(冻结问题也在之前)*
listen = / dev / shm / phpfpm user = www-data group = www-data 下午=dynamic ; 圣洁,4000! 好吧,把这个值降到地球一级给了我 ; 100个502坏的网关命令。 这个数值相当稳定。 ; 因为只有最多520用户在线,我没有得到它,为什么我需要 ; 尽可能多的孩子在这里configuration。 由于保持活力吗? ; 问问题对我来说更容易,因为重新启动服务器将会使 ; 我的社区成员生气了) pm.max_children = 4000 pm.start_servers = 100 pm.min_spare_servers = 50 pm.max_spare_servers = 150 pm.max_requests = 10 pm.status_path = / status ping.path = / ping ping.response = pong slowlog = log / $ pool.log.slow ;我应该使用rlimit? ; rlimit_files = 1024 chdir = /
mysql /下的my.cnf
[客户] 端口= 3306 socket = /var/run/mysqld/mysqld.sock [mysqld_safe的] socket = /var/run/mysqld/mysqld.sock 好= 0 的[mysqld] user = mysql socket = /var/run/mysqld/mysqld.sock 端口= 3306 basedir = / usr datadir = / var / lib / mysql tmpdir = / tmp 跳过外部locking bind-address = 127.0.0.1 key_buffer = 16M max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 8 myisam-recover = BACKUP ; 数量很多,但less了一些phpBB的错误。 max_connections = 450 table_cache = 512 ; 我读了两次的CPU核心,不好? thread_concurrency = 12 join_buffer_size = 2084K concurrent_insert = 3 query_cache_limit = 64M query_cache_size = 512M query_cache_type = 1 log_error = /var/log/mysql/error.log log_slow_queries = /var/log/mysql/mysql-slow.log long_query_time = 2 expire_logs_days = 10 max_binlog_size = 100M LOW_PRIORITY_UPDATES = 1 [mysqldump的] 快 引号名称 max_allowed_packet = 16M [使用isamchk] key_buffer = 16M !includedir /etc/mysql/conf.d/
我已经使用smartctl,硬盘似乎很好。 / proc / mdstatus引号:
个性:[raid1] [线性] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md3:活动raid1 sda3 [1]
1459264192 blocks [2/1] [_U]
md1:激活raid1 sda1 [0]
3911680 blocks [2/1] [U_]
未使用的设备:
ulimit -a
核心文件大小(块,-c)0 数据分段大小(千字节,-d)无限制 调度优先级(-e)0 文件大小(块,-f)无限制 未决信号(-i)127727 最大locking内存(千字节,-1)64 最大内存大小(千字节,-m)无限制 打开文件(-n)1024 pipe道大小(512字节,-p)8 POSIX消息队列(字节,-q)819200 实时优先级(-r)0 堆栈大小(千字节,-s)8192 cpu时间(秒,-t)无限制 最大用户进程(-u)127727 虚拟内存(千字节,-v)无限制 文件锁(-x)无限制
我在configuration文件中引用了一些问题,这些问题不是直接与问题相关的,而是对我来说知道他们确实是可疑的或者是正确的。
另外一个事实:我的MYSQL数据库的大小是12GB。
我不知道这是否重要,但mytop有时会显示我4-5秒长的插入查询,有些是20-30秒长。 它只是一种感觉,我无法certificate(因为我不知道如何),但是当我禁用数据库,冻结似乎不会发生。
例:
我创build了一个虚拟rails应用程序来查看开发日志。 该应用程序做了一些SQL查询,读取和插入。
日志往往是这样的:
DbTest Load(0.3ms)SELECT * FROM`db_test` WHERE(`db_test`.`id` = 31722)LIMIT 1 SQL(0.1ms)BEGIN DbTest Update(0.3ms)UPDATE`db_test` SET`updated_at` ='2012-07-04 23:32:34'WHERE`id` = 31722 - 现在日志静止5-60秒。 SQL(49.1ms)COMMIT - SQL日志中的更新时间不包括冻结时间 渲染testing/索引 在96ms完成(查看:16,DB:59)| 200 OK [http:// localhost:9000 / test]
不好的部分是:这里的迷你冰箱也只是不时发生。 注意:同时我甚至不能通过scp上传文件。
我目前感觉像是跑到糟糕到更糟的地步,因为对服务器configuration的知识缺乏了解,所以回到了我的服务器问题上。 这仍然让我怀疑,为什么这些问题甚至出现,一次250个用户是不是这么高的金额,对不对?
所以我的问题:
最新错误以及如何解决? ;) 要么:
我可以提供什么信息来使情况更加清晰?
感谢您的时间和帮助。
最好的问候,丹尼尔
PS:我把configfiles重命名为domain.tld,因为我不想让更多的负载到服务器,直到它修复。 可能是一个夸张的想法..
PPS:如果我问完整的重复问题,对不起。 我的search结果似乎是相当具体的在自己的方式。
刚刚得到一些iotop 99.99%的价值,而系统似乎被冻结。 这个事实可以考虑吗?
现在我只是注意到,这甚至occours与3-5的负载.. iotop结果是从0-99%raid / mysql .. mhmm
您已经查看了各种指标,但似乎已经错过了我要开始的那些指标:在经济放缓的过程中,您的请求会发生什么情况 – 而您预计所有的指标都会变慢,是否有更高级别的url访问导致事件? 事件是否遵循任何与时间有关的模式?
你似乎有高水平的并发性 – 但你的MySQLconfiguration的一部分似乎是为MyISAM设置的 – innodb可能会更好的这个设置,但一个缓慢的mysqld只会间接影响负载指标(除非120个等待进程都是mysqld? )。 你在运行混合引擎吗? 如果你坚持使用MyISAM,那么减less线程数量并增加key_buffer_size。 无论您的表使用哪个引擎,将您的长查询时间更改为零(至less暂时),并开始使用mysqldumpslowparsing这些日志文件。
我不会相信hdparm的基准testing – 它是bonnie ++和fio之类的一个非常糟糕的替代品,但即使是后者也很难用来模拟实际的应用stream量。
最后一次,我像随机冻结,这是一个恶劣的硬盘驱动器电缆导致驱动器超时,需要重新启动偶尔; 我可以预料到,这个级别的错误在dmesg中会被大声地报告:S
我build议你在https://dba.stackexchange.com/上发表主题“MySQL在写数据时减慢系统速度”,因为这似乎是MySQL的问题。 它不能与PHP,因为这也发生在RoR。 此外,您可能希望在SSH中使用PHP或Ruby连接到MySQL并执行从命令行写入,或直接访问MySQL,然后尝试。 如果在这两种情况下系统变慢,那么它必须是MySQL,而不是nginx。
如果硬盘驱动器在本地RAID上,请检查电池状态是否正常,并且本地caching已启用,否则写入速度会变慢
也可以使用mpstat -P ALL查看所有核心在高峰时间是否同样繁忙