我有很多空闲内存。我如何使用它来提高性能?

3 mysql performance linux memory

我正在运行 Litespeed(使用 suExec、PHP SAPI)、MySQL、DirectAdmin,在具有 16 核 Xeon CPU 和 2GB RAM 的 VPS 上命名。

目前,仅使用了 2048 个中的 300 MB。这听起来可能很愚蠢,但是如何让 vps 使用更多 RAM?

我的.cnf:

[client]
port            = 3306
socket          = /var/lib/mysql/mysql.sock


[mysqld]
port                                            = 3306
socket                                          = /var/lib/mysql/mysql.sock
skip-locking
key_buffer                                      = 512M
max_allowed_packet                              = 8M
table_cache                                     = 4096
sort_buffer_size                                = 16M
read_buffer_size                                = 8M
join_buffer_size                                = 2M
read_rnd_buffer_size                    = 32M
myisam_sort_buffer_size                 = 128M
myisam_repair_threads                   = 1
myisam_recover
max_heap_table_size                             = 8M
tmp_table_size                                  = 8M
thread_cache_size                               = 8
thread_concurrency                              = 8
query-cache-type                                = 1
query_cache_limit                               = 4M
query-cache-size                                = 16M

log-slow-queries=/var/log/mysqlslowqueries.log
local-infile = 0
wait_timeout = 10
interactive_timeout = 15
max_connections = 35

character-set-server            = utf8
default-character-set           = utf8

skip-networking
skip-federated
skip-symbolic-links

skip-innodb
[mysqldump]
quick
max_allowed_packet = 32M

[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 4M
write_buffer = 4M

[mysqlhotcopy]
interactive-timeout

[isamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M

[mysqld_safe]
open-files-limit = 8192
Run Code Online (Sandbox Code Playgroud)

我实际上确实需要提高 MySQL 性能,因为它是最消耗 CPU 的过程,并且有些查询无法优化但需要一些时间来执行。

任何有关如何有效使用内存以提高性能的建议将不胜感激。

小智 5

内存可以通过缓存来帮助您,从而减少 I/O。

但是,这不会减少 CPU 使用率,这是您的问题。这是一个不寻常的瓶颈,因为对于大多数数据库工作来说,CPU 的速度非常快,而 I/O 往往是瓶颈。

在你的情况下,它更不寻常,因为你有 16 核,而 VPS 往往没有很好的 I/O 性能。首先,请确保您受 CPU 限制。vmstat应该在这里有所帮助。如果wa列上的数字很高,则可能是 I/O 限制;us列上的高数字可能表明您确实受 CPU 限制。

如果您受 CPU 限制,请分析您正在执行哪些查询以及为什么它们需要很长时间才能完成。您要么正在执行大量查询,要么包括复杂的计算(即聚合、函数等)。前者的解决方案通常是在前端缓存,这意味着执行更少的查询。后者是通过简化您的查询(如果可能的话 - 您可能有不必要的复杂查询)并计算一次并重用它来解决(假设您有很多聚合查询;创建一个包含聚合结果和查询的表,而不是运行连续聚合)。对此进行研究的最有效方法是记录您正在运行的查询并分析存在的日志工具,这些工具可以巧妙地执行此操作。

如果您受 I/O 限制,那么您可以调整内存使用,尽管操作系统缓存通常工作正常。看看free

$ free
             total       used       free     shared    buffers     cached
Mem:       6122892    5903564     219328          0     257020    3119240
-/+ buffers/cache:    2527304    3595588
Swap:     11956220      65980   11890240
Run Code Online (Sandbox Code Playgroud)

第一行数字说明内存使用情况,包括操作系统缓存,第二行没有;通过比较两者,您可以了解操作系统缓存是如何工作的。此外,vmstat将已经告诉您正在执行多少 I/O(bibo列)。通常,解决 I/O 问题的关键是查询调优和索引;索引防止全表扫描(即读取整个表以获取有限的数据集,这会导致过多和不必要的 I/O)。同样,记录查询在这里最有效——EXPLAIN在查询上运行将告诉您数据库正在执行哪些操作来执行查询,这通常会导致您了解查询中的低效率(并更改查询以解决它们)或了解需要的索引。