提高 VPS 上托管的应用程序的 mysql 服务器速度

提高 VPS 上托管的应用程序的 mysql 服务器速度

我在我的 VPS 上运行了几个应用程序。这些应用程序使用 PHP 构建并用于社交网络。目前,我的服务器速度有些问题。我的 VPS 具有以下特点:

CPU 2x2000GHz
Memory: 3Gb
SAS 15K 100 Gb
CentOS 5.5

my.cnf(MyIsam引擎):

max_connections=80
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 128
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
query_cache_type=1
query_cache_size=20M
server-id       = 1
[mysqldump]
quick
max_allowed_packet = 10M
default-character-set = cp1251
[mysql]
no-auto-rehash
default-character-set = cp1251
[isamchk]
key_buffer = 8M
sort_buffer_size = 8M
[myisamchk]
key_buffer = 8M
sort_buffer_size = 8M

我们还安装了memcached:

PORT="11211"
USER="nobody"
MAXCONN="1024"
CACHESIZE="500"
OPTIONS="-l 127.0.0.1"

mysql 服务器进程列表的很小一部分:

更新 1

| 314041 | obwaga2_ob1       | localhost       | obwaga2_ob1 | Query   |    0 | Sending data     | SELECT `uid` FROM `obschaga_users` WHERE `uid`>0                                   | 
| 314045 | obwaga2_ob1       | localhost       | obwaga2_ob1 | Query   |    0 | Locked           | UPDATE `obschaga_users` SET `online`=1306785866 WHERE `uid`=46217997 LIMIT 1       | 
| 314046 | obwaga2_ob1       | localhost       | obwaga2_ob1 | Query   |    0 | Locked           | UPDATE `obschaga_users` SET `online`=1306785866 WHERE `uid`=21704816 LIMIT 1 

问题在于当有 200-280+ 个连接连接到 Apache Web 服务器时,负载会达到 60-80%。您能否更正我的 mysql/memcached 服务器设置以加快服务器速度?如果您需要有关服务器配置的更多信息 - 请告诉我。

先感谢您。

更新2

我定期面临以下问题:

-bash-3.2# uptime
-bash: fork: Cannot allocate memory

show status like 'Threads_connected';命令显示 93 个线程。我猜想当服务器不响应命令时,线程会更多。

有时我会遇到以下错误:

ERROR 1040 (00000): Too many connections

Mysql进程如下:

  | 1630030 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `sex` FROM `obschaga_users` WHERE `uid`<>134663653 and `club`=1 and `online`>=1306849507      | 
    | 1630031 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `level`,`clan`,`silver`,`win`,`lost`,`val`,`otkaz`,`wgift` FROM `obschaga_users` WHERE `uid`= | 
    | 1630032 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `uid`,`online` FROM `obschaga_users` WHERE `uid` IN (96113249, 88303183, 123525384, 37125913, | 
    | 1630033 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `obsch`,`online` FROM `obschaga_users` WHERE `uid`=114941284 LIMIT 1                          | 
obschaga_users` WHERE `uid`= | 
    | 1630036 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `uid1` FROM `obschaga_wait_friend` WHERE `uid0`=39448276 and `state`=10 LIMIT 1     

有趣的是,有很多回忆free -mto节目:

             total       used       free     shared    buffers     cached
Mem:          3000       1111       1888          0          0          0
Swap:            0          0          0
Total:        3000       1111       1888

我应该展示cat /proc/user_beancounters还是ulimit -a

答案1

您的配置很可能没有问题。更有可能的是,您的代码中需要进行算法改进。您没有提到负载是由 Apache、MySQL 还是其他程序生成的。这是首先要检查的。如果是 Apache,请先分析您的 PHP 代码。专家非常适合这个。

如果 MySQL 可能是罪魁祸首,请查看慢查询日志。还可以花时间使用解释陈述。

以下 SQL 查询也值得怀疑:

SELECT `uid` FROM `obschaga_users` WHERE `uid`>0

这看起来好像要返回整个表中的每个 uid(我怀疑许多 uid 都是负数)。如果在您的应用程序中运行此查询,则可能会出现巨大的性能问题。至少要确保 uid 列上有索引。但是,实际上永远不要使用这种查询。必须有某种额外的搜索条件来减少返回的数据量。

答案2

将我的评论更改为答案

  1. 确保您没有用尽 60 个最大连接数。show status like 'Threads_connected';在高峰时段运行以查看是否达到最大值。

  2. MySQL 的缓冲区大小非常适中。如果 Apache 没有使用所有内存,请将其增加到如下大小:

    bulk_insert_buffer_size=32M 
    join_buffer_size=4M 
    key_buffer_size=128M 
    max_allowed_packet=32M 
    query_cache_limit=4M 
    read_buffer_size=1M 
    read_rnd_buffer_size=2M 
    sort_buffer_size=8M 
    table_cache=128 
    tmp_table_size=32M
    

答案3

您的列表中仅显示 3 个进程,其中 2 个为写入,1 个为读取。MyISAM 对写入执行表锁定。

您可以随意摆弄,但您可能应该考虑购买另一个 VPS,并将 MySQL 单独放在其上。即拥有一个 Web/应用程序层和一个 DB 层。您可能还应该认真考虑迁移到具有更高并发性/行级锁定的 InnoDB。

干杯

相关内容