我的网站和服务器都很庞大,我的服务器有8GB RAM和6个处理器核心。
我从我的托pipe团队收到一封邮件,关于mysql数据库的负载,
现在,我的网站运行速度非常慢,我收到的邮件中包含一个日志文件
root@server [~]# mysqladmin pr +-------+------------------+-----------+--------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-------+------------------+-----------+--------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+ | 17969 | leechprotect | localhost | leechprotect | Sleep | 103 | | | | 18706 | database_user | localhost | database_name | Sleep | 25 | | | | 18717 | database_user | localhost | database_name | Query | 19 | Sending data | SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id, se_users.user_username, se_users.us | | 18737 | database_user | localhost | database_name | Query | 19 | Sending data | SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id, se_users.user_username, se_users.us | | 18745 | database_user | localhost | database_name | Query | 20 | Sending data | SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id, se_users.user_username, se_users.us | | 18752 | database_user | localhost | database_name | Query | 19 | executing | SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id, se_users.user_username, se_users.us | | 18777 | database_user | localhost | database_name | Query | 17 | executing | SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id, se_users.user_username, se_users.us | | 18815 | database_user | localhost | database_name | Query | 15 | Sending data | SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id, se_users.user_username, se_users.us | | 18926 | database_user | localhost | database_name | Query | 2 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18951 | database_user | localhost | database_name | Sleep | 1 | | | | 18952 | database_user | localhost | database_name | Query | 1 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18953 | database_user | localhost | database_name | Sleep | 1 | | | | 18954 | database_user | localhost | database_name | Sleep | 1 | | | | 18955 | database_user | localhost | database_name | Query | 3 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18958 | database_user | localhost | database_name | Sleep | 1 | | | | 18960 | database_user | localhost | database_name | Query | 2 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18961 | database_user | localhost | database_name | Query | 2 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18962 | database_user | localhost | database_name | Query | 3 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18963 | database_user | localhost | database_name | Query | 3 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18964 | database_user | localhost | database_name | Query | 2 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18965 | database_user | localhost | database_name | Query | 1 | executing | SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id, se_users.user_username, se_users.us | | 18967 | database_user | localhost | database_name | Sleep | 0 | | | | 18968 | database_user | localhost | database_name | Query | 2 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18974 | database_user | localhost | database_name | Query | 2 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18978 | database_user | localhost | database_name | Query | 1 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18979 | database_user | localhost | database_name | Query | 1 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18980 | database_user | localhost | database_name | Query | 1 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18982 | database_user | localhost | database_name | Query | 1 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18983 | database_user | localhost | database_name | Sleep | 0 | | | | 18984 | database_user | localhost | database_name | Query | 1 | executing | SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id, se_users.user_username, se_users.us | | 18985 | database_user | localhost | database_name | Query | 1 | Sending data | SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1' | | 18986 | database_user | localhost | database_name | Sleep | 0 | | | | 18987 | database_user | localhost | database_name | Sleep | 0 | | | | 18988 | database_user | localhost | database_name | Sleep | 0 | | | | 18989 | database_user | localhost | database_name | Sleep | 0 | | | | 18990 | root | localhost | | Query | 0 | | show processlist
我无法理解这个日志,任何人都可以帮助我
我的最高命令
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 11050 mysql 15 0 1510m 272m 4080 S 629.0 7.0 675:31.90 mysqld 26990 database_user 16 0 130m 24m 6812 R 25.4 0.6 0:00.84 php 26989 database_user 16 0 155m 39m 7652 R 21.8 1.0 0:00.76 php 26988 database_user 16 0 154m 38m 7648 R 21.5 1.0 0:00.74 php 27011 database_user 16 0 0 0 0 R 18.8 0.0 0:00.57 php 26835 database_user 16 0 156m 40m 7632 R 17.5 1.0 0:00.69 php 26909 database_user 16 0 0 0 0 Z 16.5 0.0 0:00.68 php <defunct> 26977 database_user 16 0 0 0 0 Z 14.2 0.0 0:00.51 php <defunct> 26947 database_user 15 0 154m 37m 7632 R 12.9 1.0 0:00.58 php 26844 database_user 16 0 0 0 0 Z 11.2 0.0 0:00.59 php <defunct> 26956 database_user 15 0 154m 38m 7632 R 10.9 1.0 0:00.42 php 27005 database_user 16 0 146m 30m 7596 R 8.3 0.8 0:00.25 php 27058 database_user 16 0 139m 22m 7328 S 7.9 0.6 0:00.24 php 26878 database_user 16 0 0 0 0 Z 7.6 0.0 0:00.44 php <defunct> 27052 database_user 17 0 140m 23m 7292 R 7.6 0.6 0:00.23 php 27037 database_user 15 0 143m 26m 7320 S 7.3 0.7 0:00.22 php 26964 database_user 16 0 0 0 0 Z 6.9 0.0 0:00.29 php <defunct>
🙂
您的托pipe团队提供的不是日志,而是当前正在运行的Mysql进程,它是从mysqladmin(ocesslist)获得的。
而你的Mysql proc列表显示你有多个主要2个查询的实例:
SELECT count(friend_id)AS total_friends FROM se_friends WHERE friend_status ='1'
SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id,se_users.user_username,se_users.us
我不确定它们是否完整,但是您应该优化您的查询。 例如: – 你应该使用count(*)而不是count(friend_id)
而且你没有启用查询caching? 如果不是的话,你应该启用这个function,因为这样会提高性能。 如果这样做,则应该检查查询caching状态以进一步调整,以便将最常用的查询保留在caching中。
按照系统的最高输出,Mysql占用了CPU的600%,看起来你的Mysql服务器非常需要一些调整。 顺便说一句,你最高的解释是不正确的,这不是数据库用户(MySQL用户),但系统用户。
而且由于大量的PHP进程也消耗了服务器负载,因此整个服务器需要进行一些调整。 尽快完成它。
要优化Mysql,您应该尝试调整以下variables:
以下variables将设置全局缓冲区
MAX_CONNECTIONS
MAX_USER_CONNECTIONS
table_cache的
key_buffer_size的
query_cache_sizevariables
下面的variables将设置每个线程缓冲区:
tmp_table_size max_heap_table_size
read_buffer_size sort_buffer_size
join_buffer_size
下面的变数必须调整如果你使用InnoDB:
innodb_log_buffer_size
innodb_additional_mem_pool_size
innodb_buffer_pool_size
还有很多其他variables也需要考虑。 但是,如果您调整上述variables以适应您的要求,那么就会在性能方面造成一个不同的世界。
但是,除非你真的明白这些variables的正确值是什么,否则不要这样做。 因此,在开始调整生产服务器上的Mysql之前,先了解它,因为如果做得不好,可能会逆火。
如果你没有足够的时间去学习,请把知道这个工作的人拿来完成。
“发送数据”中的大量过程意味着在逻辑层中处理响应时出现错误,或者很多查询返回非常大的结果集。 你没有提到逻辑层的实现。
看着SQL,同样的SQL作物一次又一次:
SELECT count(friend_id) AS total_friends FROM se_friends WHERE friend_status='1'
我真诚地希望这是被截断的 – 而且还有一个更有意义和更具体的命令丢失 – 否则这是毫无意义的。 您应该能够从慢查询日志中看到更多。
这个查询只返回一行。 但是,SQL需要花费大约2秒钟的时间来执行,而逻辑来检索数据(因为没有任何这些执行,这表明查询运行速度非常快,不到0.1秒 – 大部分时间都被占用由逻辑层)。 虽然这可能是由于数据库和逻辑层之间的networking非常慢而引起的,但在这里并不是这样(连接来自本地主机)。 它也可能发生在上下文切换出现问题的地方 – 数据库服务器和客户端不断被其他进程抢占。 但是对于6核心,这将需要一个非常积极的过程。
如果你能得到你的逻辑层来更快地检索数据,这将对负载产生巨大的影响。
请提供有关正在运行的SQL和逻辑层以及“top”输出的更多详细信息
看上面你的时间栏,看起来下面的语句是最慢的:
SELECT DISTINCT SQL_CALC_FOUND_ROWS se_users.user_id, se_users.user_username, se_users.us
这是花费最多的时间,它看起来只是整个表格的select,但我无法确定,因为它看起来像其余的声明被切断了…
为了改变这个,你可以包含引用索引的WHERE语句,使用LIMIT命令,或者使用EXPLAIN命令来debugging你的语句。
如果你有能力/调整数据库,你可能也想看看mysqltuner 。 如果你正试图debugging你的MySQL数据库的负载,那么top的输出可能是不相关的。