首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有多少用户足以为web应用程序带来沉重的负载?

问有多少用户足以为web应用程序带来沉重的负载?
EN

Stack Overflow用户
提问于 2010-12-20 02:59:28
回答 3查看 639关注 0票数 3

我有一个web应用程序,最近几天一直承受着很大的负担。该应用程序运行在单台服务器上,该服务器具有8核、英特尔CPU、和4gb内存。软件:Drupal 5(Apache2,PHP5,MySQL5)运行在Debian上。

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

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

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

  • 我的桌子是MyIsam,听说它们使用的是表级锁定,非常慢,对吗?我可以放心地把它换成Innodb吗?
  • 如果我拿着MySQL,把它移到有大量内存的专用机器上呢?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-20 04:15:27

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

  1. Profile.通过一个分析器运行应用程序,并尽可能多地在现实世界中使用.最好的做法是使用贯穿所有层的自动化测试或一系列单元测试,使分析会话尽可能可重复。即使在较低的负载下分析应用程序,也可以识别瓶颈并加以改进。您应该同时分析应用程序代码和SQL代码。
  2. 瓶颈。分析将告诉您哪些代码和/或查询占用的时间最多,修复这些代码和/或查询将非常有帮助,但您也希望寻找可以避免的架构瓶颈。是否有用户在等待他们不需要等待的写作?您是否可以使用生产者/消费者队列来排队某些非关键的写入,以便应用程序能够更快地响应用户,并将这些数据延迟地刷新到db。是否有任何长期运行的请求正在等待其他外部资源,可以从异步处理中获益?
  3. 缓存。是否有一些请求或数据可以缓存?即使这不是瓶颈,尽可能减少服务器上的负载也会有所帮助。特别是如果您有很多数据库争用,并且可以在应用程序中缓存一些常用的数据,那么您可以避免一些数据库往返。
  4. 内存数据。看看您的应用程序是如何使用数据库的,看看数据库中是否有任何不需要使用的东西。如果是这样的话,将这些数据移动到内存中的数据结构(甚至是内存中的数据库)将大大提高性能。然而,这并不常见,但如果是的话,这将是一个巨大的好处。
票数 2
EN

Stack Overflow用户

发布于 2010-12-20 04:42:43

有两个重要的数字出现在我的脑海中:

  1. 退化点:当应用程序减速时,用户数量。
  2. 断点:导致应用程序崩溃的用户数。

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

您的评论表明您找到了退化点,并且您认为您的数据库就是争用点。有两个MySQL启动参数可以帮助您验证您的假设,如下所示:

-日志-缓慢-查询

-日志查询-不使用-索引

使用"ps“监视您的进程,以确定哪些进程正在消耗更多的内存,哪些cpu用于确定体系结构的哪些部分正在消耗更多的资源。另一个很好的数据支持您的分析将是vmstat,也许每60秒。

简而言之,使用ps和vmstat启动监视器,在增加用户数量的同时强调应用程序,当应用程序减速时,停止监视器,同时绘制进程cpu和内存以及当前的活动用户计数,从那时起,您可以确定您的问题是CPU还是内存,一旦您发现问题是CPU还是内存,您只需为给定的资源选择前10个进程,这些都是争用的候选进程。检查MySQL日志,以确定在哪里可以添加新索引,并确定是否可以重写一些缓慢的查询。

票数 0
EN

Stack Overflow用户

发布于 2010-12-28 08:40:09

如何解决你的问题

建议

  • 禁用统计模块
  • 删除任何不重要的模块

先决条件

  • 安装APC -或任何类似的东西
  • 启用了Drupal缓存,但没有启用进攻性缓存

Option1

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

Option2

  • Cacherouter安装斗篷。这将将缓存get/set从db替换为所需的选项(Memcache或如果内存耗尽-文件系统)。
  • 缓存用于授权用户 Install 授权缓存它与cacherouter完美地工作,但它只适用于6x。此外,它还需要重新设计(但是有一个名为EasyAuthCache的项目,它可能很方便)
  • 升级到6.x --基本上在6.x版本中--有几个方便的模块可以通过缓存卸载db (在这种情况下,它们会有很大帮助)。我怀疑,你的缓慢选择来自于视图。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4486545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档