我正在开发一个系统,其中三个高级组件相互作用
Client(PHP) -- Logger (Java) -- MainBackend (Java)
PHP客户端为收到的每个请求创建一个新的Logger进程。然后,记录器通过TCP向MainBackend发送一条消息,并开始记录它从MainBackend收到的消息。请注意,Logger非常轻量级,占用的内存非常少。
我对这个系统进行了负载测试,通过增加用户数量,N,访问系统.然后,我编写了一个版本,其中Logger是多线程的,因此每个N个同时使用的用户只使用一个进程,并对线程版本进行负载测试。
结果是,多线程版本的速度要快得多,就像许多次超过某个N的速度一样,我的问题是为什么?
如果启动每个Linux进程需要一定的时间,为什么我看不到这两个图之间的常量差异(T2 - T1)?
Linux在调度进程方面的效率比Java在调度线程时的效率要低得多吗?
编辑:我没有提到的一个重要问题是,时间都是在Logger内部完成的,因此启动进程/虚拟机的时间不会影响结果--我这样做是为了尽可能少的变量。
发布于 2011-07-05 17:18:18
JVM进行运行时优化,特别是对于反复执行的代码。这需要一段时间,一段时间的热身。结果可能会更快。您可以在同一个VM中反复计时您的任务,您将看到它在开始时很慢,但在最后会变得更快。
如果您为每个小任务启动了一个新的JVM进程,那么在JVM终止之前,不会启动任何优化。
发布于 2011-07-05 15:45:04
进程比线程重。使用现有进程或现有TCP连接比每次创建新进程要快得多。所有操作系统都是如此。只有在性能不是问题的情况下,才会根据需要创建流程或连接。
您将看到在执行大多数任务所需的时间上会有一些变化,因为机器正在尝试一次完成多个任务。你应该总是期待看到一些变化。
发布于 2011-07-05 16:32:26
这不仅是创建进程或线程的时间,也是上下文切换的时间。你可以在这里找到一些数字:http://wiki.osdev.org/Context_Switching,http://en.wikipedia.org/wiki/Context_switch。
总之,具有进程信息的结构要比具有线程数据的结构大。
https://stackoverflow.com/questions/6583908
复制相似问题