这个问题最初出现在 stackoverflow.com 上,但有人告诉我我可能会在这个网站上得到更好的答案……
很快我将为一个网站非常繁忙的客户设置一个网络服务器。他有一个论坛(运行在简单机械论坛我用 PHP 编写的 SMF 无法真正改变。我想将其移动到单独的虚拟专用服务器,因为它非常繁忙,每天大约有 40,000 次点击,每天有 400 多条帖子。对于它所用的 SMF 版本(最好、最稳定的生产版本 1.1),它需要 MySQL 才能运行,所以我无法将其更改为 PostgreSQL(我可能更喜欢它)
在 Ubuntu Server 10 LTS 上安装 MySQL Server 时,我很好奇是否可以采取一些措施来确保其效率最高。我希望尽可能快地运行以降低资源消耗并确保我们能够保持在服务器的资源限制以下。使用虚拟专用服务器,我可以选择快速切换资源,但我希望确保 MySQL Server 的设置尽可能高效,因为我并不是这方面的专家。
我做了一些研究,发现一篇文章建议这样做以确保其效率:
# open mysql conf and set these settings:
# key_buffer = 16k
# max_allowed_packet = 1M
# thread_stack = 64K
nano /etc/mysql/my.cnf
# restart mysql
/etc/init.d/mysql restart
谁能给我提供一些关于这个主题的提示、暗示、链接和知识?
答案1
首先,Janne 是正确的:每天 40k 次读取和 400 次写入是零负载。几乎任何类型的设置都绝对不会出现任何性能缺陷。
我在带有 SMF 的 VPS 上运行了类似的设置。我发现它从缓存机制中受益匪浅,因为它利用了 APC。
我的设置(我向您推荐):
- Nginx
- MySQL(大多数 SMF 表都经过 InnoDB 转换)
- PHP-FPM(极具可扩展性,如果你告诉它从几个生成开始,就可以使用很少的资源)
- APC缓存
答案2
首先,每天 40 000 次点击和每天 400 多个帖子听起来不像是会让 MySQL 紧张的事情。如果分散在一天之中,每天 40 000 次点击大约相当于每秒 2 次点击,而 400 多个帖子意味着每三分钟就会出现一个新帖子。
但那真的不算多。
你没有提到正在使用什么存储引擎。对于 MyISAM 表,你需要特别调整密钥缓冲区和表缓存值。使用 InnoDB 表innodb_buffer_pool_size是最重要的一个。
这密钥缓冲区 = 16k在您的示例中,这听起来很奇怪。16 千字节的 key_buffer?没办法,至少要设置成 16M(兆字节),或者如果您的服务器有足够多的内存,那么可以设置得更大。但请注意,许多 MySQL 变量联系特定的而不是全局的值,因此如果您的服务器负载意味着数千个同时的 MySQL 连接,那么您需要调低这些值,但是如果您通常只有少量的连接但数据集很大,那么您需要调高这些值。