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