【问题标题】:What happens when the python thread is in network call(HTTPS) and the context switch happens?当 python 线程在网络调用(HTTPS)中并且发生上下文切换时会发生什么?
【发布时间】:2021-08-02 13:13:37
【问题描述】:

我遇到了一个问题,我们编写的多线程下载应用程序有时会出现 408 错误。 我们认为这可能是因为用户增加了线程数,这导致了错误。我们认为有可能在网络调用过程中发生上下文切换,导致线程没有发送调用成功所需的所有数据包,并且服务器会出现 408 超时错误。 这是可能的还是网络调用不依赖于上下文切换。

我们正在使用 python 线程和 pycurl 模块使用 120 个线程来下载数据。

【问题讨论】:

  • Python 上下文切换不影响系统调用。更有可能是由于线程过多和 CPU 负载过多,网络调用之间的时间过长。
  • 好的,如果 CS 不影响网络调用,那么 n=120 线程应该不是问题。我不明白您所说的网络调用之间的时间是什么意思?
  • 对不起,让我们再看一遍。系统调用并没有真正受到影响(包括根据您的网络调用)。如果是这种情况,那么网络调用之间的时间是什么意思,因为那句话是矛盾的。在 64 核、128gb 内存的系统上运行 120 个线程不会导致过多的 cpu 负载。该程序使用不到 0.2% 的 cpu 和 300mb 的内存。
  • "我们认为有可能在网络调用期间,发生上下文切换,导致线程没有发送调用成功所需的所有数据包,并且服务器给出 408 超时错误.”你能告诉我们你为什么这么认为吗?上下文切换会导致出站数据不完整的信念的基础是什么? (是不是因为你知道你的代码对 TCP 数据将如何打包做出虚假假设?因为如果是这样,问题在于代码中的假设,而不是上下文切换!)
  • 正如我所说,我不确定为什么会这样。我们无法控制服务器来找出服务器发送 408 的原因。这是一个思考过程,因为我们有很多线程,如果由于 GIL(全局解释器锁)一次只有一个线程在工作,我们认为可能是 CS 问题,但正如你所指出的, CS 对 N/W 调用没有影响。我们还使用了数据包嗅探器来确保我们所有的出站呼叫都带有完整的数据。也许这是我们正在调用的服务器上的可伸缩性问题。感谢您的支持。

标签: python multithreading pycurl


【解决方案1】:

你指的是什么上下文切换?

Pycurl 是一个 C 库 libcurl 的包装器。当任何 libcurl 的方法被调用时,Python 的全局解释器锁就会被释放。 Python 运行时可能会在 libcurl 执行客户端处理或实际网络 I/O 期间运行自己的线程,但“上下文切换”不会以任何方式附加到网络 I/O。

这不应该影响您的故障排除,但是因为您应该使用 tcpdump 之类的数据包捕获工具来记录您的流量并在您收到错误时识别哪一方正在发送什么,以便您可以对什么做出一些合理的理论可能会继续进行而不是猜测。

【讨论】:

  • 感谢您的帮助。我们发现这不是我们这边的问题,并且服务器可能存在一些问题,很多调用会对性能产生一些不利影响。
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 2019-10-02
  • 2019-10-22
  • 1970-01-01
  • 2017-03-28
  • 2013-10-13
  • 2011-01-18
  • 2017-02-14
相关资源
最近更新 更多