HTTP/TCP 连接握手和服务器性能的影响

HTTP/TCP 连接握手和服务器性能的影响

当在与网站相同的服务器上运行 apache bench 时,例如:

ab -n 1000 -c 10 localhost:8080/

与从不同位置访问服务器的用户相比,我很可能无法获得准确的结果。

我试图了解这会如​​何影响现实世界的性能,因为与同一州/国家/地区的用户相比,中国的用户会遇到不同的延迟问题。

假设我的 Web 服务器的最大线程限制为 100。

有人可以详细解释一下最终用户延迟会如何影响服务器性能吗?

我在这里假设每个请求将以 10ms 为单位进行同等计算。

我不明白的是外部因素如何影响整体服务器性能,特别是互联网连接(位置,甚至移动设备)和 http/tcp 握手等。

答案1

一般而言,最终用户延迟不会影响服务器性能。主要区别在于,如果最终用户延迟较高,您的服务器将同时拥有更多连接,因为每个连接需要更长的时间才能完成。但服务器仍然为每个连接执行大约相同量的工作。只要您不达到服务器限制(主要是内存),那就没关系。

服务器在收到整个请求之前不会开始为连接做任何繁重的工作。因此,如果建立连接和获取请求需要更长时间,那只意味着服务器在进行实际处理之前会等待更长时间,而基本上什么也不做。

通常,服务器一次性处理请求并将回复排队。客户端和网络延迟可能意味着需要更长的时间来清空该队列。但服务器处理此操作的部分已得到高度优化,特定页面或对象的逻辑已运行完成并生成响应。因此,这通常不会对服务器性能产生重大影响。

但是,客户端体验可能会差很多。如果服务有很多客户端必须从服务器获取信息然后重新连接以获取更多信息的情况,情况尤其如此。例如,如果网页告诉客户端加载一堆框架,然后这些框架又告诉客户端加载一堆图像,那么在客户端看到结果之前,将会有很多“来回”操作(每个操作都会增加网络延迟)。但服务器的工作量是一样的。

答案2

实际上这不是问题,除非你有一个实时操作、多处理器(比如说,1K CPU 数量)、大量内存的超级计算机……

在多进程系统中,所有进程都有一个时间窗口,称为Quantum Size。具有多进程功能的操作系统(大约从 80 年代到 90 年代再到今天)在运行的进程之间来回切换,为每个进程提供量子大小。在我们现代操作系统中,这个时间窗口大约为 20 毫秒,并且切换非常快,切换开销非常低。假设我们有一个 CPU,在 1 秒内(相当于 1000 毫秒)在两个进程之间切换,我们可以运行它们 900-950-980(可能)毫秒(差异用于进程切换)。无论如何,正如我所说,这种切换非常快,想象一下 50 个进程正在运行,我们会看到所有进程都在同时运行。实际上它们不是,这就是多处理,进程调度的基础...

当进程中有多个线程时,操作系统首先调度进程并给它一个时间片,然后调度该进程中的线程。在这个时间片中,线程也在进行调度。当整个时间片结束时,操作系统会调度另一个进程(或根据调度算法调度相同的进程),并且新进程中的线程也会被调度。

线程的执行环境有两种级别。一种是用户级,另一种是内核级。我上面提到的是用户级。进程调度、线程调度都是按该量子大小进行的。但是,当您进入内核级时,调度程序可以从不同的进程调度不同的线程。量子直接应用于内核级的线程……

说完这些,让我们开始了解终端连接延迟如何影响服务器性能:

如果要获得最大性能,线程必须处于内核级,我知道 apache 线程不处于内核模式。Apache 本身处于用户模式,它是一个用户端应用程序,其线程在用户级模式下运行。因此,您无法从该服务器获得 100% 的性能......假设线程在内核模式下运行,并且您有两个 CPU。一个线程用于第一个 CPU,一个线程用于第二个 CPU。现在两个线程确实同时运行。I/O Bounded从 OS 的角度来看,Web 工作线程实际上是一个线程,当它请求某个文件时,它将被阻止,直到文件准备好。调度程序将安排另一个工作线程运行。当“那个”文件准备就绪时,被阻止的线程将移至就绪队列并再次被调度。如此这般好......如果您有 100 个工作线程会发生什么?这个问题带来了另一个问题:何时创建工作线程?

对于 Web 服务器应用程序来说,在以下情况下会创建一个工作线程low-level IP connection is made。因此,您的实际两个线程已在运行,硬件建立了一个新连接(它们有自己的 PU,并中断主系统进行数据信息传输),弹出一个新的工作线程,它已被发送到就绪队列进行调度...

回到主题,外部因素如何影响系统性能。这全是关于系统限制。无论系统是否有足够的处理单元来处理线程数,线程数都会影响性能。基本数学,两个处理器只能同时处理两个线程……网络连接带宽通过“它可以接受多少个连接”来影响性能。假设连接数据为 10 字节,带宽为每秒 100 字节,则每秒可以有 10 个连接……

扩展这些取决于你。你只需记住一件事:你的总 CPU 资源已经在处理那些已经在就绪队列中的线程...因此当新线程出现时,它不会使现有线程的情况变得更糟。

当服务器应用程序首次启动时,性能可能是一个问题。它很快就会达到最高速度。这有点像汽车的加速。它会先加速,一段时间后达到最高速度。你可以一直保持最高速度,直到你没油或把脚从油门上移开。

相关内容