我们的网站在 2 台服务器上运行:1 台数据库服务器,1 台网络服务器。我们的理解是,网络服务器有 4GB RAM,数据库服务器有 8GB RAM。
该网站的数据库密集型,每个页面上都有许多查询。
附注:我们最近发现数据库服务器运行的是 32 位,我们认为这意味着无法充分利用 8GB 的 RAM。因此,我们假设数据库服务器上只有 4GB 内存。
该网站的性能不佳,我们正在尝试了解如何进行调整。
目前已接近峰值流量,我们的服务器负载/内存情况如下:
我们的网络服务器:服务器负载 0.49(4 个 CPU)内存使用 59.72%(4,137,968 中的 2,471,180)交换使用 0.01%(2,096,440 中的 120)
我们的数据库服务器:服务器负载 2.8(8 个 CPU)内存使用 10.76%(8,300,376 中的 893,004)交换使用 0.01%(2,096,440 中的 116)
问题如下:
我们的数据库服务器以 2.8 的负载运行,但内存只有 10%(即使只有 4GB 的 RAM,也只有 20%),这是否表明效率低下?
如果是这样,我们应该在 my.cnf 文件中解决这个问题吗?
思考内存的好方法是什么?“已用内存”越高越好,表示正在利用资源,还是越低越好?非常低的 10% 表示效率高还是效率低?
一如既往地提前感谢您的任何见解。
答案1
在 8 CPU 服务器上,2.8 的负载并不会造成太大问题;但超过 8 的负载就会造成问题。
对于任何数据库,您都希望至少所有索引都适合 RAM,并且还有一些索引可用于其他 MySQL 任务和缓存经常访问的数据。
您可能需要增加 my.cnf 中的某些值,具体取决于您使用的是 InnoDB 表、MyISAM 表还是两种表。
如果需要的话,你真的不应该担心让 MySQL 消耗更多的 RAM,毕竟它是一个专用的数据库服务器。
以下查询应该为您提供给定数据库的索引大小。
SELECT CONCAT( ROUND( SUM( index_length ) / ( 1024 *1024 ) , 2 ) , ' MB' ) AS 'Index Size' FROM information_schema.TABLES WHERE table_schema LIKE 'dbname'
答案2
这并不能直接回答你的问题,但如果你的内存充足(交换)并且平均负载也不错(看起来不错),那么你的问题很可能出在应用程序级别,而不是硬件相关(除非有任何其他硬件问题,如 iSCSI、NAS、网络问题)
您是否已彻底完成数据库优化?您的查询运行需要多长时间?
您可以通过监控运行次数最多的查询、记录慢查询(例如,耗时超过 2 秒的查询)以及使用大量EXPLAIN
语句查看查询执行计划来找出答案。关键在于,如果您的查询对大量无序数据进行全表扫描,而不是仅搜索加载在 RAM 中的索引,那么 RAM 对您帮助不大。
您还可以通过从前端减轻服务器的查询负载来帮助解决问题,例如使用 memcached。
网络上有大量用于优化数据库、添加索引等的资源。
希望这会有所帮助并祝你好运!
答案3
[...] 假设数据库服务器上只有 4 GB [...] 内存使用量 10.76% (8,300,376 中的 893,004) [...]
您显然运行了一个 32 位 Bigmem-Kernel,可以处理整个 8GB 空间。
[...] 数据库服务器的运行负载为 2.8
您是否检查过数据库服务器上的负载是否由 I/O 等待导致?在我看来,您的系统在 CPU 和 RAM 方面足够强大,但可能受到存储子系统速度缓慢的影响。
top 对 CPU 行中的 %wa 参数显示了什么?