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

我正在VPS上运行多个应用程序。 这些应用程序是用PHP构build的,用于社交networking。 目前,我在服务器速度方面有一些问题。 我的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服务器设置,以加快服务器? 如果您需要更多有关服务器configuration的信息,请告诉我。

先谢谢你。

更新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_beancountersulimit -a

机会是你的configuration是好的。 你的代码更有可能在algorithm上做出改进。你没有提到加载是由Apache,MySQL还是其他的东西产生的。 这是首先要检查。 如果是Apache,请首先分析您的PHP代码。 xhprof非常适合这个。

如果MySQL可能是罪魁祸首,请查看慢速查询日志 。 还花时间使用EXPLAIN语句。

这个SQL查询也是可疑的:

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

这看起来像是要返回整个表中的每个uid(我怀疑许多uid是否定的)。 如果这个查询在您的应用程序中运行,那么可能是一个巨大的性能问题。 至less,确保在uid列上有一个索引。 但是,真的这种查询不应该被使用。 必须有一种方法可以有一些额外的search条件来减less返回的数据量。

将我的评论改为答案

  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个进程,其中2个是写入和1个读取。 MyISAM为写操作执行表锁。

你可以摆弄所有你想要的东西,但你可能应该考虑获得另一个VPS,并把MySQL放在它上面。 即有一个networking/应用程序层和数据库层。 你也应该认真考虑迁移到具有更高并发/行级locking的InnoDB。

干杯