3

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

假设 MySQL 为瓶颈,我将 API 服务器数据库更新为 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

底线:我们如何才能减少在这个给定案例中所花费的完整时间?

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

4

2 回答 2

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 等待时,数据库(例如)不是t努力工作以返回结果。

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

于 2012-07-24T08:38:07.177 回答
0

Cassandra 在高负载下工作得更快,在世界不同地区的两个系统上的平均时间为 3 - 4 秒是可以的。

于 2012-07-24T06:23:57.317 回答