Performance 除了硬件,在并发用户数量方面,什么会影响性能?

Performance 除了硬件,在并发用户数量方面,什么会影响性能?,performance,appfog,blitz++,Performance,Appfog,Blitz++,我正在开发一个API,希望(当然)根据并发用户的数量优化性能 我已经使用Blitz运行了一些测试(我的应用程序在Appfog,PHP,512MB,1个实例上),根据这些测试,我的API可以在响应时间太高(>1000毫秒)之前处理11个并发用户 对我来说,这是令人惊讶的低。我可以添加更多的RAM和实例来改善结果,但我怀疑我的代码可能更智能 我做了一些测试,总是使用相同的硬件配置。结果是响应时间超过1000毫秒之前的并发用户数 使用我的实际API(带db查询)-->11个用户 使用只输出文本的脚本

我正在开发一个API,希望(当然)根据并发用户的数量优化性能

我已经使用Blitz运行了一些测试(我的应用程序在Appfog,PHP,512MB,1个实例上),根据这些测试,我的API可以在响应时间太高(>1000毫秒)之前处理11个并发用户

对我来说,这是令人惊讶的低。我可以添加更多的RAM和实例来改善结果,但我怀疑我的代码可能更智能

我做了一些测试,总是使用相同的硬件配置。结果是响应时间超过1000毫秒之前的并发用户数

  • 使用我的实际API(带db查询)-->11个用户
  • 使用只输出文本的脚本(最小处理)-->40个用户
  • 使用带睡眠(2)功能的脚本模拟长响应时间-->52个用户(超过(2000+1000毫秒)之前)
  • 使用内存密集型脚本(使用for循环构建数据):95个用户
我真的看不到结果之间有任何关联(每个测试都运行了很多次,结果都很相似)。脚本处理越多,并发用户越多


什么会影响并发用户的数量(除了硬件配置)?

通常,您应该考虑两个方面:

  • 瓶颈,如数据库或外部API。您的速度与最慢的组件一样慢

  • 查找将并发代码转换为顺序代码的锁。请参阅:


第二点与第一点有关。数据库或您在代码中使用的任何东西可能是内部同步的,或者可能无法很好地处理并发性。

这似乎是db可能是您的瓶颈。您是否测量了SQL语句的执行时间?另外,一般来说,web应用程序可以处理的并发用户数应用程序受很多因素的影响。你能把你的问题缩小到更具体的问题吗?我已经测量了DB查询并开始使用memcache。它极大地提高了响应时间,但没有提高并发用户的数量。这就是为什么我做了som测试,而这些结果对我来说没有任何意义e、 他们告诉我,如果降低执行时间和内存使用率,不一定会导致更多并发用户。因此,基本上我想了解为了提高并发用户的性能,我应该关注哪些指标。使用sleep()模拟更长的执行时间可能无法按您认为的方式工作。这将暂停当前线程的执行,但不会增加CPU负载。这意味着吞吐量(即您作为“并发用户”测量的吞吐量)在cpu负载方面没有变化。您能否对如何解释上述单个结果进行更多解释,以便得出结论“[…]较低的执行时间和内存使用不一定会导致更多并发用户。”?好的,这解释了我的部分结果!然后我只被测试2和测试4弄糊涂了。测试2只是一个echo语句,而测试4是一个for循环(x100000),它进行一些计算,然后回显一条消息。也许这样的for循环不是CPU密集型(?),但我对测试4的性能提高了一倍感到困惑!我希望它与测试2差不多甚至更差。我使用的是MongoLab和MemCachier。它们都是Appfog的插件,所以我远程访问它们(所有服务都在AWS EU West运行),这会是一个瓶颈吗?您会将它们定义为“外部”吗?如果它们是瓶颈,会影响CPU使用吗?我的意思是,如果数据库(在MongoLab上,即另一台服务器上)响应缓慢,这不只是影响总响应时间,而不是我的应用程序上的负载(=并发用户性能)?@luttkens:你说得对,响应时间!=吞吐量。但是,例如,如果数据库负载很重,那么随着连接数的增加,响应速度会变慢。唯一100%的方法是添加一些分析/日志记录,并找出体系结构的哪些部分占用了大部分时间。最终,它变成了数据库eck!由于Web服务器(PHP)上的线程的寿命与数据库查询的寿命一样长(并占用内存),因此数据库的响应速度较慢,需要在查询后添加upp。