zl程序教程

您现在的位置是:首页 >  工具

当前栏目

通过添加一些gems来提升Rails应用的性能

应用性能 通过 提升 添加 一些 Rails
2023-09-27 14:23:39 时间

使用Rails一段时间之后,你可能就会开始吹毛求疵的想要提高它性能。这是一系列文章中第一次考虑如何提高(即使微不足道的)Rails的性能。

我将会关注在一些gem的提速上面,在某些情况下,可能是一小部分的Rails,如html转义,String.blank?和JSON工具类。

基准原则

原则,对于仅仅在控制台wrk运行几次来讲,是一个与其过强的词语,但是我这里不是来寻找“圣杯”的,而是提供一些初始的想法。

我将从旧的apache ab切换到wrk

wrk是现代的 HTTP 基准工具,当在一个单一的多核 CPU 上运行时,能够产生巨大的负载。


wrk -t10 -c10 -d10s http://localhost:3000 

这条指令运行基准问题10s,使用10个线程,并且保持打开50个HTTP链接,也就是说,这样就足够了。记得将这些基准测试在你实际的应用中跑一下,看一下实际上的性能提高有多少。

escape_utils gem

通过可爱的escape_utils gem可以加快HTML的转义。为了使其能够在Rails中使用,需要添加一个初始值设定来解决:


begin     require escape_utils/html/rack # to patch Rack::Utils  
       !-- Responsive navigation         ==================================================== --          div   
Running 10s test @ http://localhost:3000/sidechannels/bench     2 threads and 10 connections     Thread Stats   Avg      Stdev     Max   +/- Stdev       Latency    35.40ms    3.55ms  64.70ms   91.98%       Req/Sec   142.19     11.68   164.00     83.12%     2837 requests in 10.00s, 4.92MB read   Requests/sec:    283.61   Transfer/sec:    503.34KB  

使用escape_utils gem:


Running 10s test @ http://localhost:3000/sidechannels/bench     2 threads and 10 connections     Thread Stats   Avg      Stdev     Max   +/- Stdev       Latency    34.06ms    3.89ms  63.92ms   89.10%       Req/Sec   148.65     13.36   180.00     75.94%     2960 requests in 10.00s, 5.46MB read   Requests/sec:    295.98   Transfer/sec:    558.72KB 

fast_blank gem

是否在印象里,blank?方法太慢?不用多说,试一下fast_blank gem!

仅需要在你的Gemfile中添加gem fast_blank,这应该就可以非常漂亮的提高像这篇文章中提到的String.black?方法的速度。为了测试,我仅添加下俩代码:

fast_blank是一个简单的扩展,提供了一个支持String.blank?功能的快速实现。


def fast_blank_test      n = 1000      strings = [        "",  
Running 10s test @ http://localhost:3000/sidechannels/bench     2 threads and 10 connections     Thread Stats   Avg      Stdev     Max   +/- Stdev       Latency     1.40s   207.72ms   1.58s    92.68%       Req/Sec     3.10      2.11     6.00     53.66%     69 requests in 10.01s, 33.08KB read   Requests/sec:      6.90   Transfer/sec:      3.31KB 

使用fast_blank gem:


Running 10s test @ http://localhost:3000/sidechannels/bench     2 threads and 10 connections     Thread Stats   Avg      Stdev     Max   +/- Stdev       Latency     1.33s   179.56ms   1.41s    93.33%       Req/Sec     3.07      0.80     4.00     40.00%     72 requests in 10.00s, 34.52KB read   Requests/sec:      7.20   Transfer/sec:      3.45KB 

oj gem


# oj gem   gem oj 
Running 10s test @ http://localhost:3000/sidechannels/bench     2 threads and 10 connections     Thread Stats   Avg      Stdev     Max   +/- Stdev       Latency   108.37ms    5.12ms 134.90ms   83.33%       Req/Sec    45.76      3.60    55.00     57.69%     922 requests in 10.00s, 57.41MB read   Requests/sec:     92.17   Transfer/sec:      5.74MB 

使用oj gem:


Running 10s test @ http://localhost:3000/sidechannels/bench     2 threads and 10 connections     Thread Stats   Avg      Stdev     Max   +/- Stdev       Latency    78.06ms    4.43ms  92.83ms   81.31%       Req/Sec    63.64      5.33    71.00     64.49%     1277 requests in 10.00s, 79.83MB read   Requests/sec:    127.65   Transfer/sec:      7.98MB 

使用jemalloc

好吧,这其实不是一个真正的gem,如果你想深入探究它,可以看我的这篇文章。在初始测试时,jemalloc并没有产生太多性能的提升,至少对我使用的测试用例是这样的。

提示:某些情况下,可能会默认包含在Ruby中。

更新:请一定尝试一下kzk的jemalloc gem


gem install jemalloc   je -v rails s 

深入探究你的Rails应用

不要担心,去用一下Sam Saffron的带有非常棒的FlameGraphsMiniProfiler吧!

结语

鉴于你的应用要做什么,你可能想为你的Gemfile添加上述的一些gem。通常我会把他们都添加上,当然是出于一个好的估量(你可能会想检查你的RAM利用率,然后在添加之前,进行一个完整的测试)。

oj gem基于JSON API,对Rails来说是非常不错的,使用oj gem,你可以删除视图并仅使用代言人或者你选择的模式进行序列化。


本文作者:佚名

来源:51CTO


Rails 和 Sinatra 的区别是什么? 在 IBM Bluemix 中国版的应用程序中看到Ruby Sinatra,于是想知道它和 Rails 有什么区别,但搜索一番,发现国内几乎没人关注这个问题,可能国内使用Ruby的就比较少。 有一个比较好的问题:用 Sinatra 构建网站,你会怀念 Rails 的什么特性? 但很可惜,回复并...