Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 负载测试多线程系统与使用单独进程的系统相比——为什么线程版本要快得多?_Java_Linux_Multithreading_Process - Fatal编程技术网

Java 负载测试多线程系统与使用单独进程的系统相比——为什么线程版本要快得多?

Java 负载测试多线程系统与使用单独进程的系统相比——为什么线程版本要快得多?,java,linux,multithreading,process,Java,Linux,Multithreading,Process,我正在研究一个系统,其中有三个高级组件相互作用 客户端(PHP)--记录器(Java)--主后端(Java) PHP客户端为接收到的每个请求创建一个新的Linux记录器进程。记录器然后通过TCP向MainBackend发送消息,并开始记录从MainBackend接收到的消息。请注意,记录器非常轻量级,占用的内存非常少 我通过增加访问该系统的用户数N,对该系统进行了负载测试。然后,我编写了一个版本,其中记录器是多线程的,因此每个N个并发用户只使用一个进程,并对线程版本进行了负载测试 结果是,多线程

我正在研究一个系统,其中有三个高级组件相互作用

客户端(PHP)--记录器(Java)--主后端(Java)

PHP客户端为接收到的每个请求创建一个新的Linux记录器进程。记录器然后通过TCP向MainBackend发送消息,并开始记录从MainBackend接收到的消息。请注意,记录器非常轻量级,占用的内存非常少

我通过增加访问该系统的用户数N,对该系统进行了负载测试。然后,我编写了一个版本,其中记录器是多线程的,因此每个N个并发用户只使用一个进程,并对线程版本进行了负载测试

结果是,多线程版本的速度要快得多,超过某个N的速度要快很多倍。我的问题是为什么

如果启动每个Linux进程需要一定的时间T,为什么我看不到两个图之间的常数差(T2-T1)

Linux在调度进程方面的效率是否远远低于Java在调度线程方面的效率


编辑:我没有提到的重要一点是,计时都是从Logger内部完成的,因此启动进程/虚拟机的时间不会影响结果-我这样做是为了尽可能减少变量

进程比线程更重。使用现有进程或现有TCP连接比每次创建新进程或TCP连接快得多。所有操作系统都是如此。只有在性能不是问题的情况下,您才会根据需要创建流程或连接


您将看到执行大多数任务所需的时间有所变化,因为机器试图同时执行多项任务。您应该总是希望看到一些变化。

这不仅是关于创建进程或线程的时间,而且也是关于上下文切换。您可以在这里找到一些数字:


简而言之,包含进程信息的结构比包含线程数据的结构更大。

JVM进行运行时优化,特别是对于重复执行的代码。这需要一段时间,一段热身期。结果可能快得离谱。您可以在同一个VM中重复计时任务,您将看到它在开始时很慢,但在结束时会快得多


如果您为每个小任务启动一个新的JVM进程,在JVM终止之前,不会进行任何优化。

是的,创建操作系统进程比创建Java线程慢。您没有考虑启动Java虚拟机所需的时间。我知道这一点,但这也应该是一个恒定的时间。我测量的结果是大约145毫秒。我们在这里讨论的是一个很大的差异,比如在几秒钟内T的值相当大。问题是为什么T2-T1不是一个常数,或者至少不是一个相当大的常数。我假设您的客户机也在等待进程关闭?这也可能需要一些安静的时间。顺便说一句:保留一个线程工作池,不要创建太多线程。重点是a)我们在这里讨论几个测试的结果,b)我使用的时间是平均的,c)与非线程版本相比,随着N的增加,线程版本的效率越来越高-没有恒定的差异。你所说的差异应该在很大程度上达到平均值,就像在80个用户的情况下,我的平均值是80个数字。尽管图中有噪声,但仍然有一个明显的趋势。随着JVM的升温,它会变得更快。它可以快10倍。