【问题标题】:High server load caused by mysqlmysql造成的服务器负载过高
【发布时间】:2013-11-28 21:53:22
【问题描述】:

我们正在运行一个 VPS 并且遇到由 mysql 服务器引起的高负载。目前我们无法找到这个问题的原因,因此我希望有人能指出我正确的方向。

VPS 有 4 个 CPU 和 4GB(18/11 编辑:现在 8GB)可用 RAM。磁盘信息不可用,但我相信它们不是最快的。在这个 VPS 上,我们运行 1 个 magento CE 1.7.0.2 安装和 20 个网上商店和 8 个 wordpress 安装(连接到 magento 系统)。我们确实在 magento 系统中安装了一些自定义扩展。我们使用 Ubuntu 13.04 和 Nginx 1.2.6、mysql 5.5.34、PHP 5.4.9、varnishd 3.0.4 并使用 APC 作为操作码缓存器。

跑顶时:

top - 13:58:21 up 17:51,  2 users,  load average: 4.40, 4.09, 3.91
Tasks: 119 total,   3 running, 116 sleeping,   0 stopped,   0 zombie
%Cpu(s): 94.0 us,  3.5 sy,  0.0 ni,  2.0 id,  0.2 wa,  0.0 hi,  0.0 si,  0.3 st
KiB Mem:   4049220 total,  3101744 used,   947476 free,   253548 buffers
KiB Swap:  1044476 total,    22324 used,  1022152 free,  1442356 cached
PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
22378 mysql     20   0 3439m 588m 7888 S 224.0 14.9  73:21.99 mysqld
24650 eemeega6  20   0  532m  56m  28m S  26.0  1.4   0:11.25 php5-fpm
24658 eemeega6  20   0  534m  57m  27m S  25.8  1.5   0:02.80 php5-fpm
24649 eemeega6  20   0  529m  58m  33m S  25.4  1.5   0:12.95 php5-fpm
24652 eemeega6  20   0  532m  61m  33m R  22.2  1.5   0:05.00 php5-fpm
24659 eemeega6  20   0  538m  59m  25m R  16.6  1.5   0:00.83 php5-fpm
24661 eemeega6  20   0  533m  55m  27m S  16.2  1.4   0:00.81 php5-fpm
24648 eemeega6  20   0  535m  65m  34m S  15.4  1.7   0:14.46 php5-fpm
24653 eemeega6  20   0  536m  64m  32m S  11.8  1.6   0:04.55 php5-fpm
24662 eemeega6  20   0  533m  49m  21m S   6.2  1.3   0:00.31 php5-fpm
1236 nobody    20   0  731m 369m  76m S   1.0  9.4   6:38.74 varnishd
22478 www-data  20   0 90532  10m 1044 S   0.4  0.3   0:07.56 nginx
10 root      20   0     0    0    0 S   0.2  0.0   2:29.32 rcu_sched
247 root      20   0     0    0    0 S   0.2  0.0   1:20.05 jbd2/dm-0-8`

我们的 my.cnf 文件具有以下值:

[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address        = 127.0.0.1

key_buffer      = 64M
max_allowed_packet  = 1M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 50
table_cache            = 2048
table_definition_cache = 1024
#thread_concurrency     = 10
thread_cache_size       = 24
wait_timeout        = 60
interactive_timeout = 60

query_cache_limit   = 1M
query_cache_size        = 64M

log_error = /var/log/mysql/error.log
log_slow_queries    = /var/log/mysql/mysql-slow.log
long_query_time = 8
#log-queries-not-using-indexes = /var/log/mysql/mysql-not-indexes.log

expire_logs_days    = 10
max_binlog_size         = 100M

#InnoDB
innodb_buffer_pool_size = 1280M
innodb_additional_mem_pool_size = 32M
innodb_log_buffer_size = 1M
innodb_thread_concurrency = 8
innodb_lock_wait_timeout = 60

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer      = 16M

!includedir /etc/mysql/conf.d/

mysqltuner.pl 的输出:

[--] Reads / Writes: 97% / 3%
[--] Total buffers: 1.4G global + 2.7M per thread (50 max threads)
[OK] Maximum possible memory usage: 1.6G (40% of installed RAM)
[OK] Slow queries: 0% (0/1M)
[OK] Highest usage of available connections: 42% (21/50)
[OK] Key buffer size / total MyISAM indexes: 64.0M/35.4M
[OK] Key buffer hit rate: 99.8% (902K cached / 1K reads)
[!!] Query cache efficiency: 1.2% (16K cached / 1M selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 739K sorts)
[!!] Joins performed without indexes: 129
[OK] Temporary tables created on disk: 5% (56K on disk / 1M total)
[OK] Thread cache hit rate: 99% (21 created / 16K connections)
[OK] Table cache hit rate: 24% (940 open / 3K opened)
[OK] Open file limit used: 9% (378/4K)
[OK] Table locks acquired immediately: 100% (4M immediate / 4M locks)
[OK] InnoDB data size / buffer pool: 339.7M/1.2G

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Adjust your join queries to always utilize indexes
Variables to adjust:
    query_cache_limit (> 1M, or use smaller result sets)
    join_buffer_size (> 128.0K, or always use indexes with joins)

我们运行 mysql 的时间超过 24 小时,并根据 mysqltuner 和 Tuning-primer 使用优化的大多数设置。使用修复和优化功能来优化所有数据库。

不幸的是 mysql 正在交换到磁盘,因此我认为 CPU 负载很高。

我希望有人能指出我找到交换/高负载原因的正确方向。我们没有经常遇到缓慢的日志查询(仅在重新索引 magento 时)。

如果有人需要更多信息,请询问我。

[解决方案]:

所以基本上我们通过关闭 php.ini 中的持久连接解决了这个问题:mysql.allow_persistent = Off 我们注意到 mysql 的 CPU 使用率下降。 Tuning-prmier 不再抱怨我们的应用程序没有关闭它们的连接。我们确实需要进行一些改进,因为并非所有查询都正确使用索引,但目前此修复有助于我们保持服务器正常运行。

亲切的问候, 砂光机。

【问题讨论】:

  • 您确定慢查询不是问题吗? Joins performed without indexes: 129 我看到添加索引时 CPU 负载从 200% 下降到 30% 的情况。我会从检查第三方表开始。
  • 感谢 Simon H,我正在调查缓慢的查询。我必须承认有很多查询没有执行索引。我还不知道如何正确添加索引(在哪些字段上)。增加 join_buffer_size 是个好主意吗?
  • 一般来说,在用于连接的列上添加索引是个好主意。要识别查询,您可以使用慢查询日志或类似SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, LEFT(INFO, 51200) AS Info FROM information_schema.PROCESSLIST; 的查询来识别当前正在运行的查询。
  • 在启用 log-queries-not-using-indexes 后,我已经在查看 mysql-slow.log 文件中的非索引查询,因此我观察到有很多没有索引的查询.事实上,大多数查询都来自第三方扩展(猜得好!),这使得改进变得困难。我将浏览非索引查询文件并添加索引。稍后会发布结果。到目前为止,感谢您的帮助!

标签: mysql magento ubuntu-13.04


【解决方案1】:

桑德,

不确定服务器方面的事情,虽然在 magento 中工作发现了一些有用的东西,但您可能想研究一下。

一些托管公司提供高质量的 Magento 托管解决方案和优化的服务器,以确保最佳的 Magento 性能。以下是一些您可以考虑的示例:

  • 单螺旋
  • 需要
  • Peer1Hosting
  • Zerolag

还有一次我读到了关于使用大数据和客户访问(大型数据库事务)的集群 magento,这是在 Web、数据库和文件系统级别完成的。

以下是这样做的指南:

http://www.severalnines.com/blog/how-cluster-magento-nginx-and-mysql-multiple-servers-high-availability

还有一些简单但有用的提示是:

  • 启用js、css文件合并
  • 关闭日志
  • 启用编译
  • 设置索引器 cron

我相信 wordpress 也必须有相同的东西。

希望以上内容能帮上一点忙。

【讨论】:

  • 您好 SKV,感谢您的意见。我们启用了 js/css 合并,日志被关闭,因为它是一个实时服务器。由于我们有 apc,因此目前禁用了编译,并且由于更改,我们需要经常编译。我们确实使用 cron 设置了索引器,并使用 NICE 来优先考虑在夜间运行的索引。
  • Sander,我很高兴您应该将您的一些网站(无论是 WP 还是 Magento)转移到不同的位置,可能是这样,我希望您的所有网站都在产生业务......并且服务器不是无法承担负荷。
  • 感谢 SKV,但我相信我们的服务器应该能够处理这种负载。我们每天看到大约 3k 的独立访客(根据分析),每天有 20-30 个订单。我认为服务器应该能够处理这个问题,几周前它就这样做了。但是突然之间mysql正在消耗CPU,现在我们正在研究如何解决这个问题。服务器负载从 100-150% 增加到 250-300%,流量或订单没有太大差异。
【解决方案2】:

您检查过您的可用空间吗?有一天,由于 magento 创建了巨大的日志 txt 文件,我们遇到了一些问题。检查您的 magento 站点,他们已从开发人员-> 日志设置中禁用了日志错误。这些文件的大小没有限制!至少这是我所知道的.. 希望对您有所帮助。 干杯!

【讨论】:

  • 您好vbak,感谢您的回复。我们禁用了日志设置,因为它是一个实时环境。我们有 120GB 的可用磁盘空间,所以这应该不是问题。不过感谢您的意见。
【解决方案3】:

我发现服务器性能可以通过多种方式“升级”,其中一些是:

  1. 计算出让 MySQL 处理所有数据所需的内存量,同时还提供大量已执行的 SQL 查询。 您可以阅读所有与内存相关的内容 hereunderstand how it works。之后你可以Enabling Large Page Support

  2. 我发现您可以通过启用APC 来提高性能,您可以在其中实际看到它是如何提高性能的。 也可以看看this

  3. 使用 varnish,但在这里输入的内容很长。归根结底,您需要一个非常好的配置才能使其完美运行。

  4. 如果您仍然遇到问题,请尝试使用Xdebug 找出阻碍每个进程的原因。 不过,您可以从一开始就执行最后一个,因为您的 MySQL 将尝试执行您要求的所有内容,但一次执行 1 个进程。 因此,它会将所有无法执行的进程存储在内存中,如果发生这种情况,它会溢出你的内存。

我的结论是,您可以通过从现金(Varnish、APC、MySQL mem)中获取更多与 php/mysql 相关的东西(您的服务器需要时间/资源用于什么)来重复使用,它的连接越多可以在不产生高服务器负载的情况下处理。

【讨论】:

  • 你好 Gelleby,1. 好的,我会调查的。 2.我们启用了apc。我将它添加到我的原始帖子中,忘记提及它。 3. 我们安装了 varnish 3.0.4 版本。 4. 好的好的提示我会试试的。
  • 您好 Sander,APC 告诉您什么?你可以张贴图表吗?你用什么配置做清漆?最后你确定每个 WP 和 Magento 网站都运行良好的编码?
  • 您好 Gelleby,请在此处查看我们的 APC 图:emega.nl/apc-diagram.jpg 关于我们的 Varnish 配置,我们已经集成了 Phoenix PageCache 扩展,它带有一个配置文件,我们将其修改为我们的端口和 IP 地址。如果您愿意,我可以发布上面的配置文件,但我认为我们的 mysql 配置有问题,我无法找到,因此我在这里发布。
  • 您是否尝试过为 MySQL 使用其他设置?遵循this page 上的示例?或者尝试给 MySQL 更多内存?
  • 我们使用tuning-primer和mysqltuner来优化mysql配置。我们已经升级到 8GB 内存并且我已经将 mysql 设置为使用 4GB,但是 mysqltuner 和 tune-primer 并没有抱怨所有内存都被使用了。我试过 mysqlreport ,这表明使用了 99% 的内存。但是在增加内存后问题仍然存在。你对mysql配置有什么建议吗?感谢您迄今为止的合作!
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多