如果我正在运行一个由像Puma这样的Web服务器支持的Ruby应用程序,它允许您组合进程和线程,我应该使用的每个数量是多少?假设我的代码当然是线程安全的(我正在运行支持本机线程的Ruby实现)。当然,我不是要求具体的数字,只是理论上比其他数字更好的一般比率。
如果线程速度快,因为它们使用的内存很少,那么我不应该只使用线程吗?但话说回来,我听说混合模型(线程和流程的组合)是最好的方法。我还听说我应该将进程数与核心数相匹配;那是真的吗?
答案 0 :(得分:4)
这可能不是你想听到的,但是:取决于。我认为,即使给出一个比例也是一种手工波浪。有很多变量可以影响性能(硬件可能是最大的:RAM,内核数量等)。
我遇到了一个“类似的问题”,我想找出哪些独角兽工人(应用工作人员)和nginx工作人员对我的应用程序最有效(以及缓存有什么影响)。
我发现回答这类问题的最好方法是运行一些基准测试。这或多或少都是我做的:
我写了一个脚本,在我想测试的一些网址上运行apache bench(ab
)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工作人员的示例:
4名独角兽工人和4名nginx工作人员的例子:
奖金示例:这是通过启用“俄罗斯娃娃缓存”来显着改善性能:)
但我想指出一些问题:
希望能帮到你。