• 图解 Unicorn 工作原理 at 2018年12月07日

    golang是这样的。

    • 本身很快,可以自己做http协议解析
    • 并发行好,accept得到一个新连接后,可以丢到一个gorouting里面执行socket操作和业务逻辑
    • gorouting本身很轻量,可以同时开非常多个,彼此之间可以实现并行执行

    到处都在处理error,所以程序的健壮性可以得到保障。 一般应用引入一个http包,就可以简单地实现应用服务器的功能了。

  • puts caller
    
  • 这种方式要判断当前连接是否处于事务中,重连后原连接持有的锁等信息会被丢掉,如果应用程序还在按照事务进行操作的话可能会出问题。 https://dalibornasevic.com/posts/77-auto-reconnect-for-activerecord-connections, 建议楼主参考这个。

  • DHH在Railfconf2018中很自豪的说: “我们不招聘DBA,数据库不分库分表,只用一个主实例和其他slave, 怎么省事怎么来”

    其实就是 Basecamp 量小,业务不够复杂而已。

  • Ruby 的好朋友 -- jemalloc at 2018年11月08日

    这是用动态配置的方式让应用使用jemalloc吧,不想用时可以动态修改环境变量来控制。重新编译就没这个灵活性了。https://github.com/jemalloc/jemalloc/wiki/Getting-Started

  • 小规模数据可以这样:

    • 按照created_at分区(partition)。 例如三个月或一年一个区(看具体情况),这个最简单。数据分布情况对应用透明,最近的查询会自动落到最新的分区上(得带上分区字段的查询条件)。
    • 按照某字段分表。例如,可以是created_at,三个月或一年一个表(看具体情况),分表的情况由应用自己维护。在查询时先按照created_at计算一下是在哪个表,然后就直接从对应表拿数据。
  • Ruby 的好朋友 -- jemalloc at 2018年11月04日

    我看到的解释和你接近。 对于jemalloc持谨慎态度的人一般是两个原因:

    对于glibc malloc,它为了减少多线程环境下,申请内存所产生的锁竞争,将可分配的arena数量放的比较大,这导致了严重的内存碎片,也是因为它本身不是为多线程环境而设计的。 将MALLOC_ARENA_MAX调小,可以减轻这种情况,但是会使得线程间的竞争变得严重,内存碎片是降低了,但是性能会受影响。

  • Ruby 的好朋友 -- jemalloc at 2018年11月01日

    清洗是对于脏页(dirty page)进行的回收、合并等操作,是增加可用内存和减少碎片的操作,并不会有大量的内存移动之类的操作。 具体的过程有点复杂,可以参考下附录中的这篇文章

  • Ruby 的好朋友 -- jemalloc at 2018年11月01日
  • Ruby 的好朋友 -- jemalloc at 2018年10月31日

    已经在facebook上正常运行多年了,获得了广泛的认可。 这儿有个讨论帖 https://ruby-china.org/topics/35515

  • @ThxFly @Rei 感谢,我的说法有点问题。

  • Rails项目中ruby 版本和gemset大多可以自动切换,是不是痛点得据情况而定,一般在项目切换不频繁时,ruby版本不会是痛点。

    Docker的本质是对运行环境进行隔离,主要价值在于可保证各个运行环境的一致性。 对于环境不一致导致的问题,其实也可以考虑打造一个 和生产环境高度一致的测试环境,在测试环境中暴露问题。一般由于环境不一致导致的问题,其实不会太频繁。 如果导致方案整体不可用的情况, 则可能方案的选择上欠考虑或者开发环境和生产环境差别过大。这其实也可以解决环境不一致带来的潜在问题,当然得根据情况而定。

    在开发环境中用docker,除了环境一致性的优点外,其他的差不多可以视为缺点,带来反向价值。特别是对于像我等菜鸟,在开发时,经常拼错单词, 或者变量名取的不好要改,或者其他纰漏。这些小错在代码自动reload时,可以高效的解决。docker嘛,毕竟多了一层,差不多活生生把动态语言开发搞成了静态语言开发,改一下还要构建一下。是否值得选择,也得看自身情况。

    至于用了docker是否区分Rails的三个模式,我实在想不出两者有什么关联。不用docker也不妨碍只用一种模式吧,只要你想。 用了docker,有多个模式也不会有问题。 关联何在?

    以上是我的个人观点。

  • 2018 中国 Matz 访谈视频 at 2018年10月30日

    很棒,值得一看。 直接点这个链接可进 https://v.qq.com/x/page/p0772tw9fij.html

  • Ruby 的好朋友 -- jemalloc at 2018年10月30日

    @so_zengtao的风,来个完整的

    Ubuntu MAC centos 安装jemalloc

    sudo apt-get install libjemalloc-dev
    brew install jemalloc
    sudo yum install -y jemalloc jemalloc-devel
    

    rbenv

    RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.5.0
    

    rvm

    rvm reinstall 2.5.0 --disable-binary --with-jemalloc
    

    源码安装

    ./configure --with-jemalloc
    make
    make install
    

    检查安装是否正确

    ruby -r rbconfig -e "puts RbConfig::CONFIG['LIBS']"
    # 应该输出:  -lpthread -ljemalloc -ldl -lobjc
    
  • 2.3.6 :021 > ENV['RUBY_VERSION']
     => "ruby-2.3.6"
    .3.6 :019 >  Benchmark.measure { maxa(1000)}
     => #<Benchmark::Tms:0x00007f8a60a4a780 @label="", @real=2.4335659999924246, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=2.42, @total=2.42>
    2.3.6 :020 > Benchmark.measure { maxf(1000)}
     => #<Benchmark::Tms:0x00007f8a60a3be88 @label="", @real=0.5101689999864902, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.5100000000000002, @total=0.5100000000000002>
    
     :001 > ENV['RUBY_VERSION']
     => "ruby-2.5.0"
     :022 > Benchmark.measure { maxa(1000)}
     => #<Benchmark::Tms:0x00007fe484845d30 @label="", @real=0.46752000000560656, @cstime=0.0, @cutime=0.0, @stime=0.00017400000000000054, @utime=0.46631599999999995, @total=0.46648999999999996>
     :023 > Benchmark.measure { maxf(1000)}
     => #<Benchmark::Tms:0x00007fe48282dc78 @label="", @real=0.6195719999959692, @cstime=0.0, @cutime=0.0, @stime=0.0003689999999999978, @utime=0.6181120000000001, @total=0.6184810000000001>
    

    2.3 和2.5的测试,确实也是反过来的,而且差别不小。

    我想说的是楼主的假设是不是不够科学? [].max 虽然会返回新对象,但是它的执行成本明显要低于max(a,b), 执行过程本身就会创建一大波对象(都放在ObjectSpace中的),调用越少消耗越少,虽然栈调用的消耗相对较小。

    不能简单地根据调用是否返回新对象来判断其性能吧? @quakewang

    这个测试用例中被测试的调用是在each中的,不知道虚拟机解释的时候,是否有区别优化?

  • 《Ruby原理剖析》里面介绍过,each 方法每次迭代都准备一大波对象,执行很多逻辑。而while只需要调整PC指针的值,性能不在一个量级。 具体的细节我得回去翻翻书了。

  • 用 Docker 构建开发环境 at 2018年10月16日

    把第五步how to use 整理成一个脚本,在Dockerfile中用ENTRYPOINT/CMD触发, 再加上一个平滑替换容器的脚本, 就完美了。

  • Z-Score ML里面做数据特征归一化,数学真是无处不在

  • 关于一些基础的语法问题 at 2018年10月10日
    command :add do |c|
      c.action do |global_options,options,args|
        $todo_list.create(args)
      end
    end
    

    等价于:

    command(:add) do |c|
      c.action do |global_options,options,args|
        $todo_list.create(args)
      end
    end
    

    command(:add) 会返回一个方法,后面的代码块是这个方法的"参数"。

  • 你nginx代理静态资源写的是这个:

    location ~*^/app/assets/{
    
    }
    
    

    有这个路径吗?换下下面这个试试:

    location ^~ /assets/{
    
    }
    

    顺便建议在 config/environments/production.rb 加上:

    config.serve_static_files = false # 不让后端处理静态资源请求,可以检测你nginx是否真的代理的静态资源
    
  • 精靈旅社疯狂假期, 精灵旅社精靈旅社 在写入ES时,先全部转化为简体,只存一份。在查询时将所有的繁体转化为简体,再到ES查询,可行?

  • includes 的实现原理与困境 at 2018年08月18日

    实际情况复杂,关联对象取出来后,在渲染时还需要执行很多业务逻辑,而且对象关联可能不止一层。用pluck,可能会有局限而且改造成本高。

  • 技师这个词用的好😂

  • 不是基于统计的??? 楼主能不能大概描述一下核心原理 ? thx