![]() |
1
1
我猜想节点一次运行多个vip管道,而python严格地一个接一个地运行。管道启动和关闭大多是单线程的,所以若节点同时启动多条管道,正如您所观察到的,它可能会节省一些时间。 您以随机访问模式加载JPEG图像,因此整个图像将用libjpeg解压缩到内存中。这是一个单线程库,因此您永远不会看到超过100%的CPU使用率。 接下来,执行resize/rotate/crop/jpegsave。在执行这些操作时,调整大小将很好地执行,CPU负载随着减少的平方而增加,旋转太简单,对运行时没有太大影响,裁剪是即时的。虽然jpegsave是单线程的(当然),但是vip在后台线程和write-behind缓冲区中运行它,所以您实际上可以免费获得它。 我在我的台式PC上尝试了你的程序(六个超线程内核,12个硬件线程)。我懂了:
看起来我们看到的是9.7/2.9,或者线程速度提高了3.4倍,但这很容易让人误解。如果我将vips线程池大小设置为1,您会看到更接近于真正的单线程性能(尽管它仍然使用jpegsave write-behind线程):
所以我们真的得到了18.1/2.97,或6.1倍的加速。 基准比较困难,真实/用户/系统可能很难解释。你需要考虑很多因素:
我相信还有很多我已经忘记了。 如果您好奇的话,libvips有自己的分析器,可以帮助您更深入地了解运行时行为。它可以显示各种工作线程的图形,它们在同步中花费了多长时间,管理时间,实际处理像素的时间,何时分配内存,以及何时再次释放。这里有一篇关于它的博客文章: http://libvips.blogspot.co.uk/2013/11/profiling-libvips.html |
![]() |
2
1
较小的实时时间和较高的用户+系统时间是否意味着进程(在本例中为节点)更有效地利用CPU来更快地完成任务? 这并不一定意味着他们能更有效地利用处理器。
这些时间的实际意义是什么?随着请求数量的增加,哪种时间更快/更好/更容易扩展? 执行问题是一个长期的问题,有许多警告。从python与Node的编号来看,我认为python线程更长,反过来做更多的内联处理。另一件需要注意的事情是python中的GIL。从本质上讲,python是一个单线程应用程序,您不能轻易摆脱这一点。这可能是Node实现更快(使用真实线程)的一个促成因素。 节点似乎被写入了正确的线程,并将许多任务分开。高度线程化应用程序的优点将有一个临界点,在这个临界点上,您将花费更多的时间为新线程寻找空闲的cpu,而不是实际工作。当这种情况发生时,您的python实现可能会再次变得更快。 |
![]() |
3
1
较高的用户+系统时间意味着进程有更多的运行线程,正如您所注意到的那样,360%的用户使用了4核的几乎所有可用CPU资源。这意味着NodeJS进程已经受到可用CPU资源的限制,无法处理更多请求。此外,您最终可能在该计算机上运行的任何其他CPU密集型进程都会影响您的NodeJS进程。另一方面,Python进程并没有占用所有可用的CPU资源,可能可以根据大量请求进行扩展。 |
![]() |
4
0
因此,这些时间本身并不可靠,他们说在CPU上执行一个操作需要多长时间。这与该机器上同时发生的任何其他情况紧密耦合,并且可能完全基于物理资源而剧烈波动。 具体来说,就这些时间而言:
具体来说,小实时意味着它实际上完成得更快。这是否意味着它确实做得更好,没有。例如,在同一时间机器上发生的事情可能会更少。 就规模而言,这些数字有点无关紧要,这取决于体系结构/瓶颈。例如,就规模而言,特别是云计算而言,它是关于有效地分配资源和每个资源的相关IO,通常是(计算、磁盘、网络)。尽快处理此图像是否有助于缩放?大概您需要检查瓶颈和细节以确定。例如,它可能会淹没您的网络链接,然后在您达到计算限制之前,您会受到限制。或者,您可能会受到写入磁盘的速度的限制。 |
![]() |
5
0
其中一个潜在的重要方面是,没有人提到您的库(vip)本身将启动线程: http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/using-threads.html
这解释了最初最让我惊讶的事情——NodeJS(据我所知)应该是非常单线程的,就像Python的GIL一样。这一切都与异步处理有关。 因此,vip的Python和Node绑定可能只使用不同的线程设置。这值得调查。 (也就是说,快速查看并没有发现任何库中默认并发级别发生更改的证据) |
![]() |
CaTx · 使用带有一个大于号和两个大于号的回波的区别 2 年前 |
![]() |
Ari157 · x86_64 Linux程序集中的逻辑与实现 2 年前 |
![]() |
Ty Q. · 分段故障GLFW3/GLAD 2 年前 |
![]() |
ShortArrow · 如何使用git管理链接源文件? 2 年前 |
![]() |
Bastien L. · 多Linux Grafana集成 2 年前 |