加快API响应时间

时间:2012-07-24 02:32:24

标签: python performance api cassandra

我希望减少Web服务器从给定查询的API服务器请求/接收数据的完整时间。

假设MySQL是瓶颈,我将API服务器db更新为Cassandra,但仍然完成时间保持不变。可能是别的东西是我无法弄清楚的瓶颈。

环境:

Number of Request Estimated per minute: 100
Database: MySQl / Cassandra
Hardware: EC2 Small
Server Used: Apache HTTP

当前观察结果:

Cassandra Query Response Time: .03 Secs 
Time between request made and response received: 4 Secs

必需:

Time between request made and response received: 1 Secs

BOTTOM LINE:在这种情况下,我们如何减少完成所需的时间?

如果需要,请随时询问更多详细信息。感谢

2 个答案:

答案 0 :(得分:2)

总结聊天:

  • 环境:
    • 在小型Amazon EC2实例(1个虚拟CPU,1.7GB RAM)上运行
    • Web服务器是Apache
    • 100个工作线程
    • Python正在使用Pylons(暗示WSGI)
    • 在EC2中测试客户
  • 试验:
    • 1.8k请求,单线程
      • 未知的CPU成本
      • Cassandra请求时间:0.079s(传播0.048-> 0.759)
      • MySQL请求时间:0.169s(传播0.047-> 1.52)
    • 10k请求,多个线程
      • CPU以90%
      • 运行
      • Cassandra请求时间:2.285s(传播0.102-> 6.321)
      • MySQL请求时间:7.879s(传播0.831-> 14.065)

观察:在您的小型EC2实例上,100个线程可能很多太多了。请记住,每个线程都会产生一个占用内存和资源的Python进程 - 即使没有做任何事情。减少线程会减少:

  • 内存争用(以及内存分页杀死性能)
  • CPU缓冲区未命中
  • CPU争用
  • 数据库争用

推荐:您应该只运行尽可能多的线程来最大化CPU(但如果它们在内存或其他资源上最大化则更少)。运行更多线程会增加开销并降低吞吐量。

观察:在单线程模式下,您的最佳性能时间可能会为每个请求提供0.05 CPU秒的最佳成本。假设有一些延迟(等待IO),您的CPU成本可能会低很多)。假设CPU是您的架构中的瓶颈,您可能只需要在EC2服务器上进行20-40次事务处理,只需进行线程调整。

推荐:使用标准的Python分析器来分析系统(使用最佳线程数运行时)。分析器将指示CPU花费最多时间的位置。区分等待(即数据库返回,磁盘读取或写入数据)与代码的固有CPU成本。

  • 固有CPU成本高的地方:可以降低成本吗?如果这不在您的代码中,您可以通过执行不同的操作来避免该代码路径吗?缓存?使用另一个图书馆?
  • 存在延迟的情况:鉴于您的单线程结果,延迟不一定是假设 CPU可以为另一个请求提供服务。实际上,通过计算,您可以大致了解所需的线程数:(总时间/(总时间 - 等待时间))  但是,检查一下,在Python等待的时候,DB(例如)并没有努力返回结果。

其他想法:考虑测试工具如何传递HTTP请求 - 它是否尽可能快地执行(例如尝试同时打开10k TCP套接字?)如果是这样,这可能会使您的结果。使用不同的加载模式和工具可能更好。

答案 1 :(得分:0)

Cassandra在高负荷下工作得更快,在世界不同侧面的两个系统上平均时间为3-4秒。