如何测量 Web 应用程序在用户环境中产生的负载?

How to measure the load generated by a web application on the user environment?

提问人:Paul 提问时间:10/20/2023 更新时间:10/31/2023 访问量:81

问:

我有一个旧的遗留服务,用于对 html5-pages 向用户硬件产生的负载进行基准测试。这里有一个高层次的想法:我们希望确保某些特定的网页不会冻结用户浏览器和笔记本电脑的 CPU 负载。

它现在的实现方式是:办公室里有一台带有 python 脚本的物理笔记本电脑(原文如此!),它获取一些 html 文件(为了简化起见,我们省略了文件到达这台笔记本电脑的方式的描述)并在 Google Chrome 中打开它(在无头模式下),并在 30 秒的间隔内每秒进行 100 次 CPU 测量。

测量功能最重要的部分(简化):

for p in psutil.process_iter():
    cpu_percent = p.cpu_percent(interval=collect_stats_interval)

所以关键的想法很简单:我们有一种“普通”用户的笔记本电脑,我们在这台笔记本电脑上最流行的浏览器中打开一些页面。如果在这台打开此页面的笔记本电脑上,CPU 负载低于 40%,这意味着在普通用户的笔记本电脑上,此页面也将产生几乎相同的负载,这是可以的。

换句话说,如果我们在笔记本电脑上打开此页面并且没问题,那么用户的笔记本电脑也会没问题。

现在,我必须将这些代码移动到比办公室中的笔记本电脑更可靠、更强大的基础设施上。而且,保持测量比例至关重要。 我的意思是,如果某个 html5 页面被基准测试为 35%,那么在新的基础设施上,我们需要近似所有结果。比如“在这个全新的高性能服务器上,此页面已以 5% 的 CPU 使用率为基准,因此这意味着在简单用户的笔记本电脑(旧方法)上,此页面将产生 35% 的 CPU 负载”。

但这是第一个问题:似乎我无法在任何类型的虚拟基础设施中使用这种方法并保持测量稳定。 我试图在 docker 中运行此服务,尽管有 cpu 限制的所有技巧,但我得到的只是不稳定和大的测量范围:第一次是 20%,而不是 -40%,下次是 33%。 由于在笔记本电脑上(没有任何虚拟化),这项服务运行良好,并且始终提供稳定的测量结果,我认为关键问题是虚拟化。

我之所以这么认为,是因为没有 docker 的 Ubuntu 专用虚拟机只为我提供了一堆不稳定的测量值。

这就是为什么我有第二个问题:如果没有稳定的测量,我就无法开发一些从新到旧的映射方法。 另外,我不擅长系统编程,所以我对 CPU 负载概念没有清晰的了解。我的意思是,我必须衡量什么才能确保某些软件在某些用户硬件上产生“适度”的 CPU 负载?也许有一种更好、更强大的方法来衡量这个指标——也许是 CPU 时间,也许是其他东西。

(最后!)这里有一个问题:测量裸机硬件和某些 k8s/虚拟机的 CPU 负载的最可靠和最便携的方法是什么?我必须测量什么以及如何测量?

性能 前端 CPU 使用情况 虚拟化

评论

0赞 Margaret Bloom 10/25/2023
Docker 应该不会有太大区别(模组限制),因为容器化进程只是一个使用不同命名空间运行的进程。虚拟化应该是可行的,我的意思是只要客户机在运行,vCPU 就不会被共享。视频的虚拟化可能会减慢速度并使它们波动一点,但不会像您注意到的那样大。也许测量有问题?另请注意,测量 CPU 利用率有点误导。例如,以下循环将利用 100% 的 CPU ....loop: / pause / jmp .loop
0赞 Margaret Bloom 10/25/2023
... as far as the scheduler is concerned but it's actually using very limited resources on that core. Also servers' CPUs are not very different from client CPUs. Yes, they have more advanced extensions but if Chrome was not compiled to use them it won't have much of a speed up in a server. Especially since JS is not multithreaded without WebWorkers. Sure server CPUs have higher boost frequency but by how much? So If you use Chrome compiled for a client CPU and, just to be sure, cap the max frequency, you should get similar results. Finally, ...
1赞 Margaret Bloom 10/25/2023
... maybe power/energy consumed may be a better estimator of CPU usage? Some Intel CPU support RAPL that would give you this information. One more thing: usually one benchmarks a system by profiling it (including timing it), doesn't Chrome have anything for that?
0赞 ipStack 10/27/2023
Instead of checking the CPU load, perhaps it would be wiser to use Selenium: with a script, you can simulate user actions and measure times to check that the web page is responsive.
0赞 Alex O 10/27/2023
On which operating system do you need to perform these measurements?

答:

0赞 Alex O 10/29/2023 #1

Unfortunately, I think you're right with this point:

I cannot use this approach inside any kind of virtual infrastructure

If you're running on virtual infrastructure, then a hypervisor determines the amount of CPU cycles that your test environment can use. From within the test system, you can neither tell the number of "real" CPU cycles that you consumed, nor the total number of CPU resources that were potentially available for your system.

That is, in general, you will need to check the CPU load measurement features offered by the hypervisor that provides your virtual infrastructure. Your other option is sticking with physical infrastructure.

(Virtualization in this context applies to virtual infrastructure. If you're running containers on physical infrastructure then the load measurement situation will be straightforward, but I understood that this is not your current setup.)