我正在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_beancounters或ulimit -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返回的数据量。
将我的评论改为答案
确保你没有耗尽60的最大连接数。运行show status like 'Threads_connected'; 在高峰期间,看看你是否达到最高。
你的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。
干杯