我有一个Web应用程序,最近几天一直在承受高负荷。该应用程序在单个服务器上运行,该服务器具有 8核Intel CPU 和 4gb RAM 。软件: Drupal 5(Apache 2,PHP5,MySQL5)在Debian上运行。
在达到500个经过身份验证的用户和200个匿名用户(同时)后,应用程序会大幅降低其性能,直至完全失败。最大的负载来自经过身份验证的用户,他们执行活动,导致db上的插入/更新/删除。我认为mysql是一个瓶颈。减慢这么多用户是否正常?
编辑:我忘了提到我做了一些分析。我运行了命令top, htop
,他们向我展示了MySQL正在使用所有内存!一段时间后MySQL开始执行速度非常慢,站点停机,我们必须重启/停止apache以减少负载。管理员说当时有大约200个活动的mysql连接。
最糟糕的是我们需要尽快解决这个问题,我无法进行深层剖析分析/代码重构,所以我正在考虑两种方式:
答案 0 :(得分:2)
不可能给特定数量的用户造成任何随机应用程序的减速。它完全取决于应用程序的功能以及运行方式。有很多事情要看。
个人资料。通过具有尽可能多的实际使用情况的分析器运行您的应用程序。最好的办法是使用自动化测试或一系列单元测试,这些测试贯穿所有层,使分析会话尽可能重复。即使您在较低负载下分析应用程序,也可以识别瓶颈并改进它们。您应该分析您的应用程序代码和SQL代码。
<强>瓶颈即可。分析将告诉您哪些代码和/或查询占用的时间最多,修复这些代码和/或查询会有很大帮助,但您也希望找到可以避免的架构瓶颈。你有没有等待写入的用户,他们真的不需要等待?您是否可以使用生产者/消费者队列来排队某些非关键写入,以便应用程序可以更快地响应用户并将这些数据轻松地刷新到数据库。是否有任何长时间运行的请求正在等待可以从异步处理中受益的其他外部资源?
<强>缓存即可。是否有一些可以缓存的请求或数据?即使这不是瓶颈,尽可能减少服务器上的负载也会有所帮助。特别是如果您有很多数据库争用,并且可以在应用程序中缓存一些常用数据,那么您可以避免一些数据库往返。
内存数据。看看您的应用程序如何使用数据库,看看是否有任何不需要在数据库中的内容。如果是这样,将此数据移动到内存数据结构(甚至是内存数据库)将极大地提高性能。尽管如此,这种情况并不常见,但如果是这样,这将是一个巨大的好处。
答案 1 :(得分:0)
有两个重要的数字出现在我的头上:
为了确定这些值,您需要在增加用户数量的同时测试应用程序,例如,从一个用户开始,每分钟添加另一个用户,直到您的应用程序停止响应。测量内存和CPU使用率以将这些与测试中的活动用户数相关联非常重要。
您的评论表明您发现了降级点,并且您认为您的数据库是争用点。
有2个MySQL启动参数可以帮助您验证您的假设,具体如下:
--log-slow-queries
--log查询 - 未使用的索引
使用“ps”监视您的进程,以确定哪些正在消耗更多内存和CPU以确定您的体系结构的哪些部分正在消耗更多资源。您分析的另一个好的支持数据是vmstat输出,可能每60秒。
简而言之,使用ps和vmstat启动监视器,在增加用户数量时强调应用程序,当应用程序变慢时,停止监视器并将进程cpu和内存与当前活动用户数一起绘制,从这一点你可以确定你的问题是CPU还是内存,一旦你弄明白,你将只选择该给定资源的前10个进程,这些是争用的候选者。 查看MySQL日志以确定可以添加新索引的位置,并确定是否可以重写某些慢速查询。
答案 2 :(得分:0)
禁用统计信息模块
删除所有不重要的模块
安装APC - 或任何类似的
启用Drupal缓存 - 但不是积极的
Cacherouter 安装cacherouter。这将把缓存获取/设置从db替换为所需选项(Memcache或如果你耗尽内存 - 文件系统)
授权用户的缓存安装Authcache它与cacherouter完美配合,但仅适用于6倍。此外,它需要一些重新设计(但有一个名为EasyAuthCache的项目可能很方便)
升级到6.x 基本上在6.x版本中有几个方便的模块可以通过缓存来卸载数据库(在这种情况下它们会有很多帮助)。我怀疑,你的慢选择来自于观点。