networking服务器可怕的慢,有时难以置信的速度

我正在一个非虚拟的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_pa​​cket = 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_pa​​cket = 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个用户是不是这么高的金额,对不对?

所以我的问题:

  • 最新错误以及如何解决? ;) 要么:

  • 我可以提供什么信息来使情况更加清晰?

  • 你能指出一些关键的错误的configuration,我应该考虑在文档中追赶吗?
  • 有什么工具可以运行,看到一些可能的瓶颈?
  • 还有什么build议? (旁边:“付钱的人知道他做了什么” – 它是一个私人项目,服务器成本已经足够了:))

感谢您的时间和帮助。

最好的问候,丹尼尔

PS:我把configfiles重命名为domain.tld,因为我不想让更多的负载到服务器,直到它修复。 可能是一个夸张的想法..

PPS:如果我问完整的重复问题,对不起。 我的search结果似乎是相当具体的在自己的方式。

编辑:

刚刚得到一些iotop 99.99%的价值,而系统似乎被冻结。 这个事实可以考虑吗?

EDIT2:

现在我只是注意到,这甚至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的问题&#x3002; 它不能与PHP,因为这也发生在RoR。 此外,您可能希望在SSH中使用PHP或Ruby连接到MySQL并执行从命令行写入,或直接访问MySQL,然后尝试。 如果在这两种情况下系统变慢,那么它必须是MySQL,而不是nginx。

如果硬盘驱动器在本地RAID上,请检查电池状态是否正常,并且本地caching已启用,否则写入速度会变慢

也可以使用mpstat -P ALL查看所有核心在高峰时间是否同样繁忙