我如何允许 mysqld 使用超过 24.9% 的 CPU?

我如何允许 mysqld 使用超过 24.9% 的 CPU?

我有一个运行在 RHEL 上的 Web 服务器,该服务器运行 Apache 和 MySQL。它有一个四核 3.2Ghz Xeon CPU 和 8 GB 的 RAM,大多数时候,我们都没有遇到任何问题。

我们的 Web 应用程序非常依赖数据库。当我们的使用量变得非常大时,MySQL 的 CPU 使用率将达到 24.9%。大多数时候,它停留在 5% 以下。我推测它只使用了一个 CPU 核心,并且它正在占用该核心,但 TOP 在 CPU 列中显示,即使使用率保持在 24.9%,mysqld 也会更改核心。当它这样做时,MySQL 会变得非常慢,因为它正在排队查询。是否有一些神奇的配置可以告诉 mysql 在需要时使用更多的 CPU?此外,对我的配置的任何其他建议都会有所帮助。

我们在此服务器上运行两个应用程序。一个运行 Innodb,但使用率不高(已被其他应用程序取代),另一个运行 MyIsam,使用率很高。总的来说,我们的整个 mysql 数据目录大约有 13Gigs(如果这很重要的话)。

这是我的配置:

[root@ProductionLinux root]# cat /etc/my.cnf
[mysqld]
服务器 ID = 71
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = oldapplication
binlog-do-db = newapplication
binlog-do-db = 支持
线程缓存大小 = 30
密钥缓冲区大小 = 256M
表缓存 = 256
排序缓冲区大小 = 4M
读取缓冲区大小 = 1M
跳过名称解析

innodb_data_home_dir = /usr/local/mysql/data/
innodb_data_file_path = InnoDB:100M:自动扩展
设置变量 = innodb_buffer_pool_size=70M
设置变量 = innodb_additional_mem_pool_size=10M
设置变量 = max_connections=500
innodb_log_group_home_dir = /usr/local/mysql/data
innodb_log_arch_dir = /usr/local/mysql/data
设置变量 = innodb_log_file_size=20M
设置变量 = innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit = 1
记录未使用索引的查询
日志错误 = /var/log/mysql/mysql-error.log
mysql>显示变量;
+--------------------------------+--------------------------------------------------------------------------------------------+
| 变量名称 | 值 |
+--------------------------------+--------------------------------------------------------------------------------------------+
| 自动增量 | 1 |
| 自动增量偏移 | 1 |
| automatic_sp_privileges | 开启 |
| 积压日志 | 50 |
| basedir | /usr/local/mysql-standard-5.0.18-linux-x86_64-glibc23/ |
| binlog_cache_size | 32768 |
| 批量插入缓冲区大小 | 8388608 |
| 字符集客户端 | latin1 |
| 字符集连接 | latin1 |
| 字符集数据库 | latin1 |
| 字符集结果 | latin1 |
| 字符集服务器 | latin1 |
| 字符集系统 | utf8 |
| 字符集目录 | /usr/local/mysql-standard-5.0.18-linux-x86_64-glibc23/share/mysql/charsets/ |
| 排序规则连接 | latin1_swedish_ci |
| 排序规则数据库 | latin1_swedish_ci |
| 排序规则服务器 | latin1_swedish_ci |
| 完成类型 | 0 |
| 并发插入 | 1 |
| 连接超时 | 5 |
| 数据目录 | /usr/local/mysql/data/ |
| 日期格式 | %Y-%m-%d |
| 日期时间格式 | %Y-%m-%d %H:%i:%s |
| 默认周格式 | 0 |
| 延迟键写入 | 开启 |
| 延迟插入限制 | 100 |
| 延迟插入超时 | 300 |
| 延迟队列大小 | 1000 |
| div_精度增量 | 4 |
| 引擎条件下推 | 关闭 |
| 过期日志天数 | 0 |
| 冲洗 | 关闭 |
| 刷新时间 | 0 | |
| ft_max_word_len | 84 |
| ft_min_word_len | 4 |
| ft_query_expansion_limit | 20 |
| ft_stopword_file | (内置) |
| 组连接最大长度 | 1024 |
| have_archive | 是 |
| have_bdb | 没有|
| have_blackhole_engine | 没有|
| have_compress | 是 |
| have_crypt | 是 |
| have_csv | 没有|
| 有示例引擎 | 没有 |
| have_federated_engine | 没有|
| have_geometry | 是 |
| have_innodb | 是 |
| have_isam | 没有|
| have_ndbcluster |否|
| have_openssl | 没有|
| have_query_cache | 是 |
| have_raid | 没有|
| have_rtree_keys | 是 |
| have_symlink | 是 |
| 初始化连接 | |
| 初始化文件 | |
| 初始化从属 | |
| innodb_additional_mem_pool_size| 10485760 |
| innodb_autoextend_increment | 8 |
| innodb_buffer_pool_awe_mem_mb | 0 |
默认值为 73400320。
| innodb_checksums | 开启 |
| innodb_commit_concurrency| 0|
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | InnoDB:100M:自动扩展|
| innodb_data_home_dir | 在/usr/local/mysql/data/|
| innodb_doublewrite | 开启 |
| innodb_fast_shutdown | 1 |
| innodb_file_io_线程| 4 |
| innodb_file_per_table | 关闭|
| innodb_flush_log_at_trx_commit | 1 |
innodb_flush_method 初始化方法
| innodb_force_recovery | 0 |
| innodb_lock_wait_timeout | 50 |
| innodb_locks_unsafe_for_binlog | 关闭|
| innodb_log_arch_dir | 在/usr/local/mysql/data目录下|
| innodb_log_archive | 关闭|
默认值为 8388608。
| innodb_log_file_size | 20971520 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | 在/usr/local/mysql/data目录下|
| innodb_max_dirty_pages_pct | 90 |
| innodb_max_purge_lag | 0 |
| innodb_mirrored_log_groups | 1 |
| innodb_open_files | 300 |
| innodb_support_xa | 开启 |
| innodb_sync_spin_loops | 20 |
| innodb_table_locks | 开启 |
| innodb_thread_concurrency | 20 |
| innodb_thread_sleep_delay | 10000 |
| 交互超时 | 28800 |
| 连接缓冲区大小 | 131072 |
| 密钥缓冲区大小 | 268435456 |
| 密钥缓存年龄阈值 | 300 |
| 密钥缓存块大小 | 1024 |
| 密钥缓存分区限制 | 100 |
| 语言 | /usr/local/mysql-standard-5.0.18-linux-x86_64-glibc23/share/mysql/english/ |
| 大文件支持 | 开启 |
| 大页面大小 | 0 |
| 大页面 | 关闭 |
| 许可证 | GPL |
| 本地文件 | 开启 |
| 锁定在内存中 | 关闭 |
| 日志 | 关闭 |
| log_bin | 开启 |
| log_bin_trust_function_creators | 关闭|
| log_error | /var/log/mysql/mysql-error.log |
| log_slave_updates | 关闭|
| log_slow_queries | 关闭|
| 日志警告 | 1 |
| 长查询时间 | 10 |
| 低优先级更新 | 关闭 |
| 小写文件系统 | 关闭 |
| 小写表名称 | 0 |
| 最大允许数据包 | 1048576 |
| 最大binlog缓存大小 | 18446744073709551615 |
| 最大binlog大小 | 1073741824 |
| 最大连接错误数 | 10 |
| 最大连接数 | 500 |
| 最大延迟线程数 | 20 |
| 最大错误计数 | 64 |
| 最大堆表大小 | 16777216 |
| 最大插入延迟线程数 | 20 |
| 最大连接大小 | 18446744073709551615 |
| 排序数据的最大长度 | 1024 |
| 最大中继日志大小 | 0 |
| 最大搜索次数 | 18446744073709551615 |
| 最大排序长度 | 1024 |
| 最大递归深度 | 0 |
| 最大临时表数 | 32 |
| 最大用户连接数 | 0 |
| 最大写入锁计数 | 18446744073709551615 |
| 多范围计数 | 256 |
| myisam_data_pointer_size| 6 |
| myisam_size_max | 9223372036854775807 |
| myisam_recover_options | 关闭|
| myisam_repair_threads| 1 |
| myisam_sort_buffer_size| 8388608|
| myisam_stats_method| nulls_unequal |
| 网络缓冲区长度 | 16384 |
| 网络读取超时 | 30 |
| 净重试次数 | 10 |
| 网络写入超时 | 60 |
| 新 | 关闭 |
| 旧密码 | 关闭 |
| 打开文件限制 | 2510 |
| 优化器修剪级别 | 1 |
| 优化器搜索深度 | 62 |
| pid_文件 | /usr/local/mysql/data/ProductionLinux.pid |
| 端口 | 3306 |
| 预加载缓冲区大小 | 32768 |
| 协议版本 | 10 |
| 查询分配块大小 | 8192 |
| 查询缓存限制 | 1048576 |
| 查询缓存最小解析度单位 | 4096 |
| 查询缓存大小 | 0 |
| 查询缓存类型 | 开启 |
| 查询缓存_wlock_invalidate | 关闭 |
| 查询预分配大小 | 8192 |
| 范围分配块大小 | 2048 |
| 读取缓冲区大小 | 1044480 |
| 只读 | 关闭 |
| 读取缓冲区大小 | 262144 |
|relay_log_purge|开启|
| 中继日志空间限制 | 0 |
| rpl_recovery_rank | 0 |
| 安全身份验证 | 关闭 |
| 服务器 ID | 71 |
| 跳过外部锁定 | 开启 |
| skip_networking | 关闭|
| 跳过显示数据库 | 关闭 |
| 从属压缩协议 | 关闭 |
| 从站加载_tmpdir | /tmp/ |
| 从属网络超时 | 3600 |
| 从站跳过错误 | 关闭 |
| 从属事务重试次数 | 10 |
| 慢速启动时间 | 2 |
| 套接字 | /tmp/mysql.sock |
| 排序缓冲区大小 | 4194296 |
| sql_模式| |
| sql_notes | 开启 |
| sql_warnings | 开启 |
| 存储引擎| MyISAM |
| sync_binlog | 0 |
| sync_frm | 开启 |
| 同步复制 | 0 |
| sync_replication_slave_id | 0 |
| 同步复制超时 | 10 |
| 系统时区 | CST |
| 表缓存 | 256 |
| 表锁等待超时 | 50 |
| 表类型 | MyISAM |
| 线程缓存大小 | 30 |
| 线程堆栈 | 262144 |
| 时间格式 | %H:%i:%s |
| 时区 | 系统|
| 定时互斥 | 关闭 |
| tmp_table_大小 | 33554432 |
| tmpdir | |
| 交易分配块大小 | 8192 |
| 事务预分配大小 | 4096 |
| tx_isolation | 可重复读取 |
| updatable_views_with_limit | 是 |
| 版本 | 5.0.18-标准日志 |
| version_comment | MySQL 社区版 - 标准 (GPL) |
| 版本编译机器 | x86_64 |
| 版本编译操作系统 | 未知-linux-gnu |
| 等待超时 | 28800 |
+--------------------------------+--------------------------------------------------------------------------------------------+
共 210 行 (0.00 秒)

答案1

因为您使用的是旧版本的 MySQL,该版本无法很好地支持多核扩展。

尝试升级:)

答案2

这似乎是更新单个 MyISAM 表的明显效果。写入期间整个表被锁定。

要么使用更多表,要么将那些写入量大的表切换到 InnoDB。由于表引擎的选择是针对每个表而不是针对每个数据库的,因此您可以选择最适合每个表的引擎。

请记住,MyISAM 对于大多数读取表来说速度很快,而 InnoDB 对于几乎所有其他表来说都是最好的。

此外,如果您的单个表有如此多的写入操作,请考虑更改您的体系结构。检查队列管理器(将这些更新发送到非交互式任务),或仅追加引擎(对于日志或档案来说很快,如果这是您正在做的),或用于紧密工作的不同类型的服务器(例如,如果您在将最终结果写入更持久的存储之前进行了大量临时处理,则使用内存数据库)

相关内容