【发布时间】:2011-07-05 14:01:29
【问题描述】:
我正在开发一个由三个高级组件交互的系统
Client(PHP) -- Logger (Java) -- MainBackend (Java)
PHP 客户端为收到的每个请求创建一个新的 Linux Logger 进程。 Logger 然后通过 TCP 向 MainBackend 发送一条消息,并开始记录它从 MainBackend 接收到的消息。请注意,Logger 非常轻量级并且使用的内存非常少。
我通过增加访问系统的用户数 N 对这个系统进行了负载测试。然后我写了一个 Logger 是多线程的版本,这样每 N 个并发用户只使用一个进程,并对线程版本进行负载测试。
结果是多线程版本要快得多,因为超过某个 N 时要快 很多 倍。我的问题是为什么?
如果启动每个 Linux 进程需要一定的时间 T,为什么我没有看到两个图表之间的恒定差异 (T2 - T1)?
Linux 在调度进程方面的效率是否远低于 Java 在调度线程方面的效率?
编辑:我没有提到的重要一点是,时间都是在 Logger 内部完成的,所以启动进程/虚拟机的时间不会影响结果——我这样做是为了让尽可能少的变量。
【问题讨论】:
-
是的,创建OS进程比创建Java线程慢。
-
这里没有考虑启动 Java 虚拟机所需的时间
-
我知道这一点 - 但这也应该是一个恒定的时间。我测得这大约是 145 毫秒。我们在这里谈论的是一个巨大的差异,因为 T 值相当大,在几秒钟内。问题是为什么 T2 - T1 不是一个常数,或者至少是合理的常数。
-
我假设您的客户端也等待进程关闭?它也可能需要一些时间。
-
附带说明:保持线程工作者池,不要为多个线程创建方式。
标签: java linux multithreading process