TruffleRuby 最近发布了 truffleruby-1.0.0-rc8
, 离运行完整的 Rails 应用已经很近了,值得一玩。记录一下过程,给大家做个参考。
目前已经支持 rbenv 和 rvm, 比之前手动构建方便了很多。我这边的系统是 macOS Mojave, 兼容性还不错。
确保先安装 Java, 版本大于 8, 可以直接安装 11, 多版本并存的话推荐 jenv
brew upgrade rbenv && brew upgrade ruby-build
rbenv install truffleruby-1.0.0-rc7
rbenv local truffleruby-1.0.0-rc7
gem install bundler
ruby -v
=> truffleruby 1.0.0-rc7, like ruby 2.4.4, GraalVM CE Native [x86_64-darwin]`先跑个简单的应用:Simple Sinatra App .
gem install sinatra
gem install puma
, 用 puma 来跑,更符合实际情况bundle exec puma config.ru
打开浏览器,转到 localhost:9292
就能看到了。
用 wrk 简单测试了一下,wrk -c 10 -t 5 -d 10 http://localhost:9292
, 性能有点差。比 MRI 慢了一半,反馈给官方,官方的意思是目前专注于运行完整的 Rails 应用,性能问题后面再说。
Running 10s test @ http://localhost:9293/
5 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 8.29ms 9.80ms 145.37ms 96.30%
Req/Sec 277.99 51.06 380.00 78.00%
13866 requests in 10.03s, 2.45MB read
Requests/sec: 1383.02
Transfer/sec: 249.95KB
Running 1m test @ http://localhost:9292/
5 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 144.61ms 321.44ms 1.87s 88.72%
Req/Sec 134.63 80.87 410.00 63.68%
30442 requests in 1.00m, 5.37MB read
Requests/sec: 506.60
Transfer/sec: 91.52KB
完整运行 Rails 的最大挑战来源于在 JVM 中跑 C 扩展,而 Ruby 这么多年来也没有统一的 C 扩展 API, 太多 gem 都是基于 MRI 的内部机制来开发,只能一个个适配。目前最大的两个 gem: 一个是 nokogiri
, 一个是 mysql2
.
目前来说 nokogiri
和 sqlite
的组合是没有问题的,mysql2
还在开发中。
gem install nokogiri -- --use-system-libraries
rails new simple-rails-app
如果此处提示 Gemfile not found
, 可以尝试运行 gem update
创建的项目,直接运行的会有问题,要做几个调整。
config/boot.rb:4
把 bootsnap
注释掉,暂时不支持。在 Gemfile 中增加两个 gem: gem 'concurrent-ruby', '1.1.0.pre2',require:'concurrent'
和 gem 'listen'
之后就是常规操作了。bundle exec rails g scaffold post title:string content:text
; bundle exec rails db:migrate
; bundle exec rails s
.
打开浏览器,转到 localhost:3000/posts
就能把酷炫的博客系统跑起来了
简单试了一下,性能也不乐观。期待正式版了。
看完文章,可能会对 TruffleRuby 的性能不满,但实际上单看语言运行的话还不错的。大家可以跑跑 fib 试一下,跑热之后还是可以跟 nodejs 拼一下的。
启动速度比 MRI 慢不少,但是基本上可以接受。