我在 Amazon EC2 上有一个专用服务器,在基于 alestic debian lenny 的自定义 ami 中的小实例中运行 mysql5。
小型实例(默认)* 1.7 GB 内存 1 个 EC2 计算单元(1 个虚拟核心和 1 个 EC2 计算单元) 160 GB 实例存储(150 GB 加 10 GB 根分区) 32 位平台 I/O 性能:中等
问题在于 MySQL 的 CPU 使用率从未超过 45%,而查询应该使用所有可用的 CPU,这导致查询速度变慢。
一个常见的查询是选择“%word%超过2kk行”。
这台机器上运行的另一个进程是 hyperic-hq-agent。有没有办法增加
我的cnf
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
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
language = /usr/share/mysql/english
skip-external-locking
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
myisam-recover = BACKUP
query_cache_limit = 1M
query_cache_size = 128M
innodb_buffer_pool_size = 1024M
innodb_log_buffer_size = 4M
innodb_flush_log_at_trx_commit = 2
innodb_thread_concurrency = 0
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
transaction-isolation = READ-COMMITTED
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[isamchk]
key_buffer = 16M
答案1
查询是在 localhost 中使用命令行 mysql 客户端完成的。数据库大小为 300 Mb,所以我认为所有数据库都已缓冲,因为 mysql 内存使用量约为 780 mb。
我发现了问题。
CPU 仅仅是 1 个虚拟单元,相当于当前 CPU 的近 40%。
sar 统计数据显示了这一点。
01:36:15 PM CPU %user %nice %system %iowait %steal %idle
01:36:16 PM all 43.14 0.00 0.00 0.00 56.86 0.00
01:36:17 PM all 42.16 0.00 0.00 0.00 57.84 0.00
01:36:18 PM all 42.45 0.00 0.00 0.00 57.55 0.00
01:36:19 PM all 25.00 0.00 0.00 0.00 29.00 46.00
01:36:20 PM all 0.00 0.00 0.00 0.00 0.00 100.00
01:36:21 PM all 0.00 0.00 0.00 0.00 0.00 100.00
01:36:22 PM all 0.00 0.00 0.00 0.00 0.00 100.00
%steal 由虚拟机管理程序保留给服务器或为其他虚拟 CPU 提供服务。
因此,最大值显示为 40%。
答案2
有时,有些因素会阻止进程达到满负荷 CPU。在您的示例中,由于这是一个相当简单的查询,可能包含大量数据,因此瓶颈可能是将结果发送回请求服务器的带宽 - MySQL 可能永远不会达到 100% CPU,因为它已经以最快的速度发送数据。