2016-09-20 69 views
1

我开发了一个PHP和MySQL web应用程序。最近它显示出放缓的迹象。我在090516上运行了mysql-tuner,正常运行时间为12天。MySQL数据库性能调整

服务器规格如下:
- 的Linux的CentOS 6个
- 48处理器
- 64GB RAM

这里是MySQL调谐器日志输出从090516与12D的正常运行时间:

[email protected] [~/mysqltuner]# perl mysqltuner.pl --outputfile /~/mysqltuner/result_mysqltuner.txt 
String found where operator expected at mysqltuner.pl line 3096, near 
     "get_wsrep_option 'gcache.mem_size'" (#1) 
    (S syntax) The Perl lexer knows whether to expect a term or an operator. 
    If it sees what it knows to be a term when it was expecting to see an 
    operator, it gives you this warning. Usually it indicates that an 
    operator or delimiter was omitted, such as a semicolon. 

     (Do you need to predeclare get_wsrep_option?) 
Use of implicit split to @_ is deprecated at mysqltuner.pl line 3179 (#2) 
    (D deprecated, W syntax) It makes a lot of work for the compiler when you 
    clobber a subroutine's argument list, so it's better if you assign the results 
    of a split() explicitly to an array (or list). 

>> MySQLTuner 1.6.10 - Major Hayden <[email protected]> 
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/ 
>> Run with '--help' for additional options and output filtering 

[--] Skipped version check for MySQLTuner script 
[OK] Currently running supported MySQL version 5.6.31-log 
[OK] Operating on 64-bit architecture 

-------- Storage Engine Statistics ----------------------------------------------------------------- 
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +MyISAM +PERFORMANCE_SCHEMA 
[--] Data in MyISAM tables: 913M (Tables: 11) 
[--] Data in InnoDB tables: 12M (Tables: 63) 
[!!] Total fragmented tables: 11 

-------- Security Recommendations ------------------------------------------------------------------ 
[OK] There are no anonymous accounts for any database users 
[OK] All database users have passwords assigned 
[!!] User '[email protected]' has user name as password. 
[--] There are 605 basic passwords in the list. 

-------- CVE Security Recommendations -------------------------------------------------------------- 
[OK] NO SECURITY CVE FOUND FOR YOUR VERSION 
Argument "gcache.mem_size" isn't numeric in addition (+) at mysqltuner.pl line 
     1965 (#3) 
    (W numeric) The indicated string was fed as an argument to an operator 
    that expected a numeric value instead. If you're fortunate the message 
    will identify which operator was so unfortunate. 

Argument "gcache.mem_size" isn't numeric in addition (+) at mysqltuner.pl line 
     1972 (#3) 

-------- Performance Metrics ----------------------------------------------------------------------- 
[--] Up for: 12d 6h 21m 24s (2 q [0.000 qps], 1M conn, TX: 192B, RX: 240B) 
[--] Reads/Writes: 100%/0% 
[--] Binary logging is disabled 
[--] Physical Memory  : 62.8G 
[--] Max MySQL memory : 338.9M 
[--] Other process memory: 505.0M 
[--] Total buffers: 169.0M global + 1.1M per thread (151 max threads) 
[--] P_S Max memory usage: 0B 
Argument "*main::get_wsrep_option" isn't numeric in numeric ge (>=) at 
     mysqltuner.pl line 285 (#3) 
Argument "*main::get_wsrep_option" isn't numeric in numeric ge (>=) at 
     mysqltuner.pl line 288 (#3) 
Argument "*main::get_wsrep_option" isn't numeric in numeric ge (>=) at 
     mysqltuner.pl line 291 (#3) 
[--] Galera GCache Max memory usage: *main::get_wsrep_optionB 
[OK] Maximum reached memory usage: 340.0M (0.53% of installed RAM) 
[OK] Maximum possible memory usage: 338.9M (0.53% of installed RAM) 
[OK] Overall possible memory usage with other process is compatible with memory available 
[OK] Slow queries: 0% (0/2) 
[!!] Highest connection usage: 100% (152/151) 
[OK] Aborted connections: 0.00% (34/1098331) 
[OK] Query cache is disabled by default due to mutex contention. 
[OK] No Sort requiring temporary tables 
[OK] No joins without indexes 
[OK] No tmp tables created on disk 
[OK] Thread cache hit rate: 98% (17K created/1M connections) 
[OK] Table cache hit rate: 100% (381 open/0 opened) 
[OK] Open file limit used: 2% (228/10K) 
[!!] Table locks acquired immediately: 94% 

-------- ThreadPool Metrics ------------------------------------------------------------------------ 
[--] ThreadPool stat is disabled. 

-------- Performance schema ------------------------------------------------------------------------ 
[--] Performance schema is disabled. 
[--] Memory used by P_S: 0B 

-------- MyISAM Metrics ---------------------------------------------------------------------------- 
[OK] Key buffer used: 100.0% (8M used/8M cache) 
[!!] Key buffer size/total MyISAM indexes: 8.0M/147.7M 
[!!] Read Key buffer hit rate: 87.6% (16M cached/1M reads) 
[!!] Write Key buffer hit rate: 56.8% (1M cached/777K writes) 

-------- AriaDB Metrics ---------------------------------------------------------------------------- 
[--] AriaDB is disabled. 

-------- InnoDB Metrics ---------------------------------------------------------------------------- 
[--] InnoDB is enabled. 
[OK] InnoDB buffer pool/data size: 128.0M/12.1M 
[!!] InnoDB buffer pool <= 1G and innodb_buffer_pool_instances(!=1). 
[!!] InnoDB Used buffer: 17.82% (1460 used/ 8192 total) 
[OK] InnoDB Read buffer efficiency: 100.00% (290756388 hits/ 290757478 total) 
[!!] InnoDB Write Log efficiency: 12.12% (3691 hits/ 30446 total) 
[OK] InnoDB log waits: 0.00% (0 waits/34137 writes) 

-------- TokuDB Metrics ---------------------------------------------------------------------------- 
[--] TokuDB is disabled. 

-------- Galera Metrics ---------------------------------------------------------------------------- 
[--] Galera is disabled. 

-------- Replication Metrics ----------------------------------------------------------------------- 
[--] Galera Synchronous replication: NO 
[--] No replication slave(s) for this server. 
[--] This is a standalone server. 

-------- Recommendations --------------------------------------------------------------------------- 
General recommendations: 
    Run OPTIMIZE TABLE to defragment tables for better performance 
    Set up a Secure Password for [email protected] (SET PASSWORD FOR 'user'@'SpecificDNSorIp' = PASSWORD('secure_password');) 
    Reduce or eliminate persistent connections to reduce connection usage 
    Optimize queries and/or use InnoDB to reduce lock wait 
Variables to adjust: 
    max_connections (> 151) 
    wait_timeout (< 28800) 
    interactive_timeout (< 28800) 
    key_buffer_size (> 147.7M) 
    innodb_buffer_pool_instances (=1) 

我很少有东西会跳出来,但我不是经验丰富的MySQL DBA,因此我正在从堆栈社区寻求建议。请告知我应该在my.cnf中修改哪些设置,并且如果我需要在PHPMYADMIN中对表进行碎片整理,是否需要在非工作时间内完成。

我没有注意到我的网络应用程序放慢速度,直到最近,最近我做了一次内核更新后重新启动了服务器。目前这篇文章的正常运行时间为19小时。

**额外信息:** Web应用程序有一个用户使用移动设备登录的前端和一个办公室员工管理提交(这是表单)并将它们发送到不同部门的后端。

如果需要,我可以用munin图表更新。我知道服务器严重过度配置(意味着它有更多的RAM和处理器,而不是必要的,但我希望有更多的不足)。我的问题是,我可以简单地调整一些my.cnf设置(如mysqltuner建议的和/或由phpmyadmin建议)以提高效率?

+0

请[编辑]你的问题来解释你的整个应用程序好一点。你的服务器严重超配MySQL。它看起来像数据库客户端软件的连接速率非常高。如果这是一个Web应用程序,请尝试使用连接池并减少处理Web连接的同时进程或线程的数量。 –

+0

感谢您的回复。 Web应用程序有一个前端,用户使用移动设备进行登录,后端则由办公室员工管理提交(表单)并将其发送到不同的部门。如果需要,我可以用munin图表更新。我知道服务器严重过度配置(意味着它有更多的RAM和处理器,而不是必要的,但我希望有更多的不足)。 我的问题是,我可以简单地调整一些my.cnf设置(如mysqltuner建议的和/或由phpmyadmin建议)以提高效率? – Aaron

回答

0

在接下来的十年中,MySQL不太可能被重构,使得它可以有效地使用四个以上的处理器。所以,您的供应浪费了44个处理器内核。这似乎太多了。另外,它看起来像MySQL使用的内存少于1GiB。

通常情况下,MySQL是建立起来的,不是up的。含义:大多数扩展基于MySQL的应用程序的人通过使用数据库的镜像来完成这项工作。 MariaDB的最新版本有一个多主镜像方案。

您遇到麻烦的唯一明显区域就是搅动。您应该编辑您的my.cnf文件以增加您使用的同时连接数。

您需要调查您的Web应用程序是否使用连接池。 Web应用程序需要一段时间才能建立与数据库的连接,并且如果您要为每个Web请求重新建立连接,则开放操作可能成为瓶颈。您的统计信息每天24小时,每天12天,每秒显示一个以上的新连接。除非您的工作量在一天中的所有24小时内都非常稳定地分布,否则这意味着您的网络应用正在以非常高的新连接速度达到峰值。这很可能是你放缓的原因。

你没有说你正在使用什么样的web应用程序平台。大多数平台都有连接池操作。大多数Web应用程序使用一套或两套DBMS凭据(用户名)来执行所有Web应用程序操作,因此它们可以重用池中的连接。你的统计数据表明你在数据库上有600多个不同的用户。这对于一个网络应用程序来说非常重要。

此外(这是违反直觉的)有时太多的web应用程序线程可能会损害性能。有时用户体验限制线程数量会更好,并让Web服务器排队来自客户端的请求,而不是一次尝试执行太多操作。现代服务器上的TCP堆栈允许SYN请求的合理深度队列,因此排队不会显着。

这是基于您显示的有限数据的观点:您的瓶颈不是MySQL。