3

我有一个 Web 应用程序,最近几天一直承受着高负载。该应用程序在具有8 核 Intel CPU4GB RAM的单台服务器上运行。软件:在 Debian 上运行的 Drupal 5(Apache 2、PHP5、MySQL5)

在达到 500 个经过身份验证的用户和 200 个匿名用户(同时)后,应用程序的性能急剧下降,直至完全失败。最大的负载来自经过身份验证的用户,他们执行活动,导致数据库上的插入/更新/删除。我认为mysql是一个瓶颈。对这么多用户放慢速度是否正常?

编辑:我忘了提到我做了某种分析。我运行了命令top, htop,它们向我展示了 MySQL 正在使用所有内存!一段时间后,MySQL 开始运行非常缓慢,站点出现故障,我们必须重新启动/停止 apache 以减少负载。管理员说当时大约有 200 个活动的 mysql 连接。

最糟糕的一点是我们需要尽快解决这个问题,我无法进行深度剖析分析/代码重构,所以我正在考虑两种方法:

  • 我的表是 MyIsam,我听说他们使用非常慢的表级锁定,对吗?我可以不用担心将其更改为 Innodb 吗?
  • 如果我使用 MySQL,并将其移动到具有大量 RAM 的专用机器上怎么办?
4

3 回答 3

2

不可能给出会导致任何随机应用程序速度变慢的特定用户数量。这完全取决于应用程序的功能和运行方式。有很多事情要看。

  1. 轮廓。 通过使用尽可能多的实际使用情况的分析器运行您的应用程序。最好的办法是使用贯穿所有层的自动化测试或一系列单元测试,以使分析会话尽可能可重复。即使您在较低负载下分析您的应用程序,您也可以识别瓶颈并改进它们。您应该同时分析您的应用程序代码和 SQL 代码。

  2. 瓶颈。分析将告诉您哪些代码和/或查询占用的时间最多,修复这些将有很大帮助,但您还想寻找可以避免的架构瓶颈。您是否有用户在等待他们实际上不需要等待的写入?您是否可以使用生产者/消费者队列来排队某些非关键写入,以便应用程序可以更快地响应用户并将这些数据懒惰地刷新到数据库。是否有任何长时间运行的请求正在等待可以从异步处理中受益的其他外部资源?

  3. 缓存。是否有一些可以缓存的请求或数据?即使这不是瓶颈,尽可能减少服务器上的负载也会有所帮助。特别是如果你有很多数据库争用,你可以在应用程序中缓存一些常用的数据,那么你可以避免一些数据库往返。

  4. 内存数据。查看您的应用程序如何使用数据库,并查看数据库中是否有任何不需要的内容。如果是这样,将这些数据移动到内存数据结构(甚至内存数据库)将大大提高性能。虽然这通常是不可能的,但是当它发生时,它是一个巨大的好处。

于 2010-12-20T04:15:27.390 回答
0

我想到了两个重要的数字:

  1. 退化点:应用程序变慢时的用户数。
  2. 断点:导致您的应用程序崩溃的用户数量。

为了确定这些值,您需要在增加用户数量的同时测试您的应用程序,例如,从一个用户开始,每分钟添加一个用户,直到您的应用程序停止响应。测量内存和 CPU 使用情况以将它们与测试中的活跃用户数量相关联非常重要。

您的评论表明您找到了降级点,并且您认为您的数据库是争用点。有 2 个 MySQL 启动参数可以帮助您验证您的假设,它们如下:
--log-slow-queries
--log-queries-not-using-indexes

使用“ps”监控您的进程以确定哪些进程消耗更多内存,使用 cpu 确定架构的哪些部分消耗更多资源。您分析的另一个很好的支持数据将是 vmstat 输出,可能每 60 秒一次。

简而言之,使用 ps 和 vmstat 启动监视器,在增加用户数量的同时给应用程序施加压力,当应用程序变慢时,停止监视器并将进程 cpu 和内存与当前的活动用户数一起绘制图表,从那时起你可以确定您的问题是 CPU 还是内存,一旦确定,您将只选择该给定资源的前 10 个进程,这些是争用的候选者。查看 MySQL 日志以确定您可以在哪里添加新索引并确定是否可以重写一些慢查询。

于 2010-12-20T04:42:43.637 回答
0

快速说明如何解决您的问题

建议

  • 禁用统计模块

  • 删除任何非关键模块

先决条件

  • 安装 APC - 或类似的东西

  • 启用 Drupal 缓存- 但不是激进的缓存

选项1

  • Memcache + Memcache API - 安装Memcache API。这将通过处理授权用户的会话来卸载 db。

选项2

  • 缓存路由器安装缓存路由器。这会将 db 中的缓存获取/设置替换为所需的选项(Memcache 或内存不足 - 文件系统)

  • 为授权用户缓存安装Authcache它与 cacherouter 完美配合,但仅适用于 6x。另外,它需要重新设计(但有一个名为 EasyAuthCache 的项目可能很方便)

  • 升级到 6.x基本上在 6.x 版本中,有几个方便的模块可以通过缓存卸载 db(在这种情况下它们会很有帮助)。我怀疑,您的缓慢选择来自视图。

于 2010-12-28T08:40:09.807 回答