编辑:

编辑:

我正在非虚拟 64 位 ubuntu 11.04 系统上运行一个小型社区(6000 多名成员)。

我不是 Linux 专家,甚至不是高级 Linux 专家,我只是尝试设置一个 Web 服务器,它实际上并没有什么特别的功能。它的任务是提供一些动态 PHP 和 RoR 网站。因此它可能我的配置文件确实看起来很糟糕。另外,我可能使用了错误的词汇,所以如果有疑问,请询问。

目前,同时在线的注册用户(论坛帐户,无系统用户)数量达到 520 人,平均服务器负载约为 2.0 - 5.0。同时(约 250 名用户)平均服务器负载值约为 0.4 - 0.8,有时,在一些昂贵的搜索中负载值会更高一些。一切都很好。

然而,有时负载会增加到 120(120.0,而不是 12.0 ;))。此时,甚至很难通过 SSH 连接,但是当我访问服务器并使用 top/htop/iotop 查看发生了什么时,我无法识别导致高 CPU 负载的任何进程。

iotop 告诉我当前的读写速度大约为 70kb/s,我认为这与断电相当。

内存使用量最大为 16GB 中的 12GB,因此交换空间保持为空。

现在很奇怪(至少对我来说:)

等待几分钟(因为当这种情况发生时我总是有点惊慌,感觉像是 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] 中搜索 - 没有找到任何内容。

/var/log/errors 但是告诉我:

7 月 4 日 20:28:30 localhost 内核:[19080.671415] INFO:任务 php5-fpm:27728 阻塞超过 120 秒。
7 月 4 日 20:28:30 localhost 内核:[19080.671419]“echo 0 > /proc/sys/kernel/hung_task_timeout_secs”禁用此消息。

多次。现在该消息确实告诉我 php5-fpm 任务已被阻止或确实被阻止了? - 但不知道这是否是原因或只是“冻结”的结果之一。有人知道吗?

长话短说,我甚至不知道从哪里开始分析。所以如果你能通过查看以下规格和配置给我任何建议,或者要求我提供更多信息,我会很高兴。

眼镜:

    6 核 AMD Phenom(tm) II X6 1055T 处理器 *
    16 GB 内存
    2x 1.5 TB Seagate ST1500DL003-9VT16L 通过 SATA 3 通过 SoftwareRaid (我猜)

服务:(由于服务 --status-all,具有 [ + ] 的服务)

    nginx Web 服务器 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 + 每晚备份。
     系统日志工具

网站由 2 个子域名组成,forum 和 www。其中 forum 是 phpBB3.x PHP-Board,www 是 Ruby on Rails 2.3.11 应用程序(门户)。

简短说明:有时我注意到论坛非常慢,相比之下,门户网站总是很快(除了这个“冻结”)。两者共享同一个数据库,但门户网站以只读方式使用它。

Web 服务器是 nginx,使用 phusion 乘客模块与 ruby​​ 应用程序通信。此外,对于论坛,它通过套接字与 php5-fpm 通信:

相关 nginx 配置部分(带有以 ; 开头的评论/问题)

;如果由于文件系统活动过多而导致冻结,是否需要添加限制?
#worker_rlimit_nofile 50000;
用户www数据;
;6 个核心,因此我读到 6 个适合。也许已经错了?
工作进程 6;  
pid /var/run/nginx.pid;
事件 {
        工作者连接1024;
}


http {
        Passenger_root /var/lib/gems/1.8/gems/passenger-3.0.11;
        乘客_ruby /usr/bin/ruby1.8;

;该论坛曾经有一个聊天功能,无需 websockets 即可运行。
;所以这是拉取请求的地狱(现在已停用,冻结仍在发生)
        保持活动超时 65;
        保持活动请求 50;
        开启 gzip;

        服务器 {
                听80;
                服务器名称www.domain.tld;
                根目录/var/www/domain/rails/public;
                乘客已启用;
        }

        服务器 {
                听80;
                服务器名称 forum.domain.tld;

                地点 / {
                        根/var/www/域名/论坛;
                        索引索引.php;
                }
; 由 nginx 处理的静态内容
                位置 ~* ^/style/.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
                        访问登录关闭;
                        30天后到期;
                        根目录/var/www/域/论坛/;
                }

; 现在是 php 魔法,注意“后端”-fcgi_pass
                位置 ~ .php$ {
                        fastcgi_split_path_info ^(.+\.php)(.*)$;
                        fastcgi_pass 后端;
                        fastcgi_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 内容类型 $内容类型;
                        fastcgi_param 内容长度 $内容长度;
                        fastcgi_intercept_errors开启;
                        fastcgi_ignore_client_abort关闭;
                        fastcgi_连接超时60;
                        fastcgi_发送超时 180;
                        fastcgi_读取超时180;
                        fastcgi_buffer_大小 128k;
                        fastcgi_缓冲区 256 16k;
                        fastcgi_busy_buffers_大小:256k;
                        fastcgi_temp_file_write_size 是 256k;
                        fastcgi_max_temp_file_size 0;
                }

                位置 ~ /\.ht {
                        全部否认;
                }

        }

;php5-fpm 套接字。我读到 /dev/shm/ 应该是最快的地方。总的来说,这是一个坏主意?
        上游后端 {
                服务器 unix:/dev/shm/phpfpm;
        }
       ...
}

php5-fpm 设置(我更改了这些值,因为 php5-fpm 错误日志消息越来越高..(之前也存在冻结问题)*

监听 = /dev/shm/phpfpm
用户 = www-数据
组 = www-数据
pm = 动态


; 天哪,4000!好吧,把这个值缩小到地球水平给了我
;502 个错误网关命令中有 100 个。这些值相当稳定。
;因为最多只有 520 个用户在线,我不明白,为什么我需要
;与这里配置的子项一样多。可能是因为要保持活力?
;对我来说提问更容易,因为重启服务器将使
;我的社区成员很生气 ;)
下午.max_children = 4000
pm.start_servers = 100
pm.min_spare_servers = 50
pm.max_spare_servers = 150
pm.max_requests = 10

pm.status_path = /状态
ping.路径 = /ping
ping.响应 = pong
slowlog = log/$pool.log.slow

;我应该使用 rlimit 吗?
;rlimit_文件 = 1024

更改目录 = /

mysql/my.cnf

[客户]
端口 = 3306
套接字 = /var/run/mysqld/mysqld.sock

[mysqld_safe]
套接字 = /var/run/mysqld/mysqld.sock
好 = 0

[mysqld]
用户 = mysql
套接字 = /var/run/mysqld/mysqld.sock
端口 = 3306
basedir = /usr
数据目录 = /var/lib/mysql
tmpdir = /tmp
跳过外部锁定
绑定地址 = 127.0.0.1
密钥缓冲区 = 16M
最大允许数据包 = 16M
线程堆栈 = 192K
线程缓存大小 = 8
myisam-recover = 备份

;数字很高,但较低时会出现一些 phpBB 错误。
最大连接数 = 450
表缓存 = 512

;我读取了两倍的 CPU 核心,不好吗?
线程并发 = 12
连接缓冲区大小 = 2084K
并发插入 = 3
查询缓存限制 = 64M
查询缓存大小 = 512M
query_cache_type = 1

log_error = /var/log/mysql/error.log
log_slow_queries = /var/log/mysql/mysql-slow.log
长查询时间 = 2
过期日志天数 = 10
max_binlog_size = 100M
低优先级更新=1

[mysqldump]
快的
引述名称
最大允许数据包 = 16M

[isamchk]
密钥缓冲区 = 16M
!includedir /etc/mysql/conf.d/

我已经使用了 smartctl,hdds 似乎没问题。/proc/mdstatus 引用:

个性:[raid1] [线性] [多路径] [raid0] [raid6] [raid5] [raid4] [raid10]
md3 :活动 raid1 sda3[1]
      1459264192 块 [2/1] [_U]

md1 :活动 raid1 sda1[0]
      3911680 块 [2/1] [U_]

未使用的设备:

ulimit -a

核心文件大小(块,-c) 0
数据段大小(千字节,-d)无限制
调度优先级 (-e) 0
文件大小(块,-f)无限制
待处理信号 (-i) 127727
最大锁定内存(kbytes,-l)64
最大内存大小(kbytes,-m)无限制
打开文件(-n)1024
管道大小(512 字节,-p)8
POSIX 消息队列(字节,-q)819200
实时优先级 (-r) 0
堆栈大小(kbytes,-s)8192
CPU 时间(秒,-t)无限制
最大用户进程数 (-u) 127727
虚拟内存(kbytes,-v)无限制
文件锁 (-x) 无限制

我在我的配置文件中引用了一些问题,这些问题(故意的)与问题没有直接关系,但如果我知道它们是否确实值得怀疑或是否做对了,那就太好了。

另外一个事实:我的MYSQL数据库大小为12GB。

我不知道这是否重要,但 mytop 有时会显示 4-5 秒长的插入查询,有些则长达 20-30 秒。这只是一种我无法证明的感觉(因为我不知道如何证明),但当我禁用数据库时,冻结似乎不会发生。
示例:

我创建了一个虚拟 rails 应用程序来查看开发日志。该应用程序进行了一些 sql 查询、读取和插入。

日志经常像这样:

DbTest 负载(0.3 毫秒)SELECT * FROM `db_test` WHERE (`db_test`.`id` = 31722) LIMIT 1
 SQL(0.1毫秒)开始
 DbTest 更新(0.3 毫秒)更新 `db_test` 设置 `updated_at` = '2012-07-04 23:32:34' 其中 `id` = 31722

 - 现在日志静止 5-60 秒。

 SQL(49.1毫秒)提交

 - 日志中的 SQL-Update 时间不包括冻结时间

渲染测试/索引
96ms 内完成 (查看:16,DB:59) | 200 OK [http://localhost:9000/test]

糟糕的是:这里的这种小冻结也只是偶尔发生。注意:同时我甚至无法通过 scp 上传文件。

由于对服务器配置缺乏了解,我现在感觉自己只能通过谷歌搜索我的服务器问题,情况越来越糟。我仍然想知道,为什么会出现这些问题,因为一次 250 个用户并不是一个很高的数量,对吧?

我的问题是:

  • 哪里出了问题以及如何修复? ;) 或者:

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

  • 您能指出一些我应该考虑在文档中解决的关键错误配置吗?
  • 有没有什么工具可以运行来查看一些可能的瓶颈?
  • 还有其他建议吗?(旁边是:“付钱给一个知道自己在做什么的人” - 这是一个私人项目,服务器成本已经够高了。:))

感谢您的时间和帮助。

谨致问候,丹尼尔

附言:我将配置文件重命名为 domain.tld,因为我不想在问题修复之前给服务器增加任何 % 的负载。这可能是一个夸张的想法。

PPS:如果我问了一个完全重复的问题,很抱歉。我的搜索结果似乎以自己的方式非常具体。

编辑:

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

编辑2:

现在我刚刚注意到这甚至发生在 3-5 的负载下.. iotop 结果是从 0-99% raid/mysql.. 嗯

答案1

您查看了各种指标,但似乎忽略了我要开始关注的指标:在速度变慢期间,您的请求时间会发生什么变化 - 虽然您预计一切都会变慢,但是否有访问级别更高的 URL 导致事件发生?事件是否遵循与时间相关的任何模式?

你似乎有很高的并发水平 - 但是部分您的 MySQL 配置似乎是为 MyISAM 设置的 - innodb 可能更适合这种设置,但是缓慢的 mysqld 只会间接影响负载指标(除非 120 个等待进程都是 mysqld?)。您是否在运行混合引擎?如果您坚持使用 MyISAM,请减少线程数并增加 key_buffer_size。无论您的表使用哪种引擎,请将长查询时间更改为零(至少暂时),然后开始使用 mysqldumpslow 解析这些日志文件。

我不会太相信 hdparm 的基准测试 - 它是 bonnie++ 和 fio 之类的产品的糟糕替代品 - 但即使是后者也很难用来模拟真实的应用程序流量。

答案2

上次我遇到这样的随机死机,是因为硬盘电缆有问题,导致驱动器超时,偶尔需要重新启动;我本来以为这种级别的错误会在 dmesg 中被大声报告 :S

答案3

我建议你发一个主题“MySQL 在写入数据时降低系统速度”,网址为https://dba.stackexchange.com/,因为这似乎是 MySQL 的问题。这不可能是 PHP 的问题,因为 RoR 也会出现这种情况。此外,您可能希望在 SSH 中使用 PHP 或 Ruby 连接到 MySQL 并从命令行执行写入,或者直接访问 MySQL 然后尝试。如果在这两种情况下系统都变慢了,那么它必须是MySQL,而不是nginx。

答案4

如果你的硬盘在本地 RAID 上 - 检查电池状态是否正常 - 并且本地缓存已启用 - 否则你的写入速度会慢得多

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

相关内容