如何减少 Linux 中的 Web 服务器负载?

如何减少 Linux 中的 Web 服务器负载?

我们有一个高流量的动态网站,每次请求都会生成大量数据库查询,为此配备了两到三台 Linux 服务器,现在我想减少服务器负载,我知道 Squid 反向缓存可以提供帮助,但这是否足够?我还有什么其他解决方案?

答案1

步骤1)修复该死的代码。

为什么每个请求都会产生这么多查询?在将更多移动部件投入到组合中之前,可以优化代码吗?安装 NewRelic 之类的东西来了解应用程序瓶颈在哪里。

步骤2)整理数据库。

您使用索引了吗?您使用得正确吗?

您是否使用了正确的 DB 引擎(MyISAM 与 INNODB)?

是否可以更有效地将内容存储在键值存储中?

步骤3)

缓存所有内容。

从最低级别开始:您的服务器在磁盘上是否有闪存缓存?

你的服务器是否有足够的内存来避免交换?

增加服务器上可用的 RAM 量,以便您可以:

  • 使用 memcached 存储数据库查询结果(通常这也需要更改代码库)。
  • 使用memcached存储预先生成的页面片段。
  • 增加数据库内存限制,以便更多的查询结果存储在内存中。
  • 安装 Varnish 反向代理,它将缓存大量页面数据,减轻后端的负载。

将服务器拆分为基于角色的集群。拥有主/从数据库对。编辑代码库,以便进行读/写拆分(读取到从服务器,写入到主服务器)。

答案2

前端缓存/负载平衡器可能会有所帮助。Nginx 和 Varnish 都是很好的选择(我个人觉得 NginX 更容易设置,Varnish 性能更高,但对于只有三个后端服务器来说,两者都足够了)。

但要真正发挥作用,您就需要攻击问题的根源。

由于您不是程序员,因此可以从分析数据库查询开始。MySQL 和 PostgreSQL 都具有“慢查询”日志选项。打开它并尝试获取几个小时(或几天)的实际流量。您可能会发现一些(2-10)非常相似的查询消耗了大部分时间。打开数据库管理控制台并运行EXPLAIN它们。在大多数情况下,只需确定要添加的正确索引就可以使性能提高 100 倍。而且这无需触及代码!

答案3

我建议使用http://en.wikipedia.org/wiki/Nginx

这将处理缓存等事宜。

答案4

部署像 memcached 这样的集成缓存来减轻数据库的负载。

相关内容