我的Web服务器应该有多少进程和线程比例?

时间:2015-02-05 11:38:01

标签: ruby multithreading concurrency multiprocessing puma

如果我正在运行一个由像Puma这样的Web服务器支持的Ruby应用程序,它允许您组合进程和线程,我应该使用的每个数量是多少?假设我的代码当然是线程安全的(我正在运行支持本机线程的Ruby实现)。当然,我不是要求具体的数字,只是理论上比其他数字更好的一般比率。

如果线程速度快,因为它们使用的内存很少,那么我不应该只使用线程吗?但话说回来,我听说混合模型(线程和流程的组合)是最好的方法。我还听说我应该将进程数与核心数相匹配;那是真的吗?

1 个答案:

答案 0 :(得分:4)

这可能不是你想听到的,但是:取决于。我认为,即使给出一个比例也是一种手工波浪。有很多变量可以影响性能(硬件可能是最大的:RAM,内核数量等)。

我遇到了一个“类似的问题”,我想找出哪些独角兽工人(应用工作人员)和nginx工作人员对我的应用程序最有效(以及缓存有什么影响)。

我发现回答这类问题的最好方法是运行一些基准测试。这或多或少都是我做的:

我写了一个脚本,在我想测试的一些网址上运行apache benchab)3次。

function run_apache_bench() {
  ab -n $N -c $C -g "results/${ID}/root_${1}.tsv"  url1
  ab -n $N -c $C -g "results/${ID}/index_${1}.tsv" url2
  ab -n $N -c $C -g "results/${ID}/show_${1}.tsv" url3
}

在具有不同工人数量的不同docker容器上。 (在生产中使用的相同硬件上。)然后我用gnuplot绘制结果并得到类似的结果:

2名独角兽工作人员和1名nginx工作人员的示例:

enter image description here

4名独角兽工人和4名nginx工作人员的例子:

enter image description here

奖金示例:这是通过启用“俄罗斯娃娃缓存”来显着改善性能:)

enter image description here

但我想指出一些问题:

  • 我没有测量内存使用量
  • Apache bench不会“触发”javascript / css请求(资产),这意味着我基本上只是测量html渲染。
  • 设置基准(自动化集装箱建设等)是一件很痛苦的事。

希望能帮到你。