CubicLouve

Spring_MTの技術ブログ

ruby

rubyのメモリ周りのメモ

記事もろもろ techracho.bpsinc.jp www.joyfulbikeshedding.com techlife.cookpad.com jemallocに関するチケット bugs.ruby-lang.org malloc_trim(0)に関するチケット bugs.ruby-lang.org その他 ld(1)の --as-needed がデフォルトになった影響でSEGVする場…

rubyのIPAddrクラスを使えばIPアドレスがCIDR範囲に含まれるかもチェックできる

rubyにはIP アドレスを扱うのためのIPAddrクラスがあります。 docs.ruby-lang.org このIPAddrクラスを使えば、IPアドレスがCIDR範囲に含まれるかもチェックできます。 irb(main):001:0> require 'ipaddr' => true irb(main):002:0> cidr_sample = IPAddr.new…

Rails 5.2以降のRails 5系でDBに都度接続している場合においてはdatabase.ymlで `reaping_frequency: null` を設定する

Rails 5.2以降でDBに都度接続している場合においてはdatabase.ymlで reaping_frequency: null を設定しないと、スレッドが枯渇してサーバーにsshすらできなくなりサーバーの再起動が必要になります。 sshはこんなエラーになります。 shell request failed on…

Railsのforce_sslとssl_optionsについて

Railsの force_ssl と ssl_options について知らないことが多かったのでまとめてみます。 railsguides.jp force_ssl force_ssl を有効にすると、ActionDispatch::SSL がミドルウェアとして差し込まれます。 rails/default_middleware_stack.rb at 5394c94a2b…

Cloud Traceを使ってGKE上で動いているモノリシックなRailsアプリのパフォーマンスを分析する

Cloud TraceはGCPが提供するマネージドな分散トレースシステムです。 cloud.google.com Cloud Traceはマイクロサービスのような分散アーキテクチャで便利に使えるものですが、もちろんモノリシックなアプリケーションでも十分に使う価値があるサービスです。…

GKE上で動いているRailsアプリでアクセスログとアプリケーションログをCloud Loggingでグルーピングする

medium.com こちらに書いてある内容をRailsで実現するためにやったことを書きます。 StackdriverはOperation Suiteと名前が変わっており、それに伴ってStackdriver loggingも Cloud Logging と名前を変えています。 GKEで動かしているアプリケーションのログ…

2020/06/02 気になった記事メモ

1 techlife.cookpad.com samsaffron.com www.joyfulbikeshedding.com techracho.bpsinc.jp Rubyのメモリーリークに関する記事を読み直し。 MALLOC_ARENA_MAX だけでは解決しない問題もあって、 malloc_trim を使ったというのも面白い。 https://linuxjm.osdn…

CloudNative Days Tokyo 2019 で「Deep Environment Parity 環境の一致について」というタイトルで発表しました

CloudNative Days Tokyo 2019 で「Deep Environment Parity 環境の一致について」というタイトルで発表しました。 運営の皆様、発表する機会をいただき本当にありがとうございました! また、スタッフ、スポンサーの皆様お疲れ様でした! 発表資料は以下です…

【Fixed】 docker official rubyの中で、2.5.1-stretch、2.5-stretch、2-stretch、stretch、2.5.1、2.5、2、latest のtagが付いているイメージにおいて、OSがdebian stretchではなくdebian jessie でビルドされていた

期間 2018/6/6 10時頃 (JST) 〜 2018/6/7 3:00頃 (JST) 対象 docker official rubyの中で、2.5.1-stretch 、 2.5-stretch 、 2-stretch 、 stretch 、 2.5.1 、 2.5 、 2 、 latest のtagがついているイメージ https://hub.docker.com/r/_/ruby/ 状態 OSがde…

Rubyのお気持ちを読む

Rubyのお気持ちが分からないことがたまにありますよね。 このスクリプトで最終的になにが表示されるでしょうか。 class A attr_accessor :foo def bar foo = baz(foo) foo end def baz(v) v end end a = A.new a.foo = 1 p a.bar # ここで表示される値は? 答…

Macで自分のRubyのプロセスのrssを調べるには

bugs.ruby-lang.org このチケットをみていて、Macで同じことをどうやるか?を考えてみました。 Macには/procがありません。 % ruby -rzlib -e'END{puts File.readlines("/proc/self/status").grep(/RSS/)}' -e'd=Zlib.gzip("data"); 100_000.times{Zlib.gunz…

Array#samplesの実装を追う(途中)

candidates = [ 'hoge', 'foo', 'bar', 'Sring_MT' ] puts candidates.sample のようなスクリプトでなぜか自分がよく当たるような気もしたので、Array#sampleの実装を追ってみた。 instance method Array#sample (Ruby 2.4.0) source メソッド定義場所はここ…

bundlerを使っていて、'/' is not writable. Bundler will use '/tmp/bundrer/home/unknown/' as your home directory temporarily.` と出たときの対応

daemontools経由等で、デーモンのプロセスを立ち上げるときに、プロセス内でbundle exec hogeなどのコマンドを実行すると、 '/' is not writable. Bundler will use '/tmp/bundrer/home/unknown/' as your home directory temporarily. のようなwarningメッ…

stackprofの原理

stackprofがどうやってプロファイルを行っているかを追ってみます。 プロファイルするコードは下記を使います。 stackprof/sample.rb at master · tmm1/stackprof · GitHub 自分用のメモなので、間違い等があるのはご容赦ください。。(随時ブラッシュアップ…

Ruby2.4に上げたら"ArgumentError: key must be %d bytes" のエラーが出るようになったことの調査と暗号化の復習

Rubyの2.4以上から、共通鍵暗号を扱うOpenSSL::Cipherにおいて、暗号化鍵と初期化ベクトル(IV)を設定する際に、指定した暗号化方式の鍵長のビット数を超えて指定した場合、ArgumentErrorを返すようになりました。 irb(main):001:0> require 'openssl' => tru…

特定のJSONの圧縮効率を調べてみる(snappy、gzip、xz、lz4、zstd)

snappyが入っているのは察してほしい データの詳細は後で書く。(これも察して欲しい。だいぶ偏ったデータではある) これから詳細をちゃんと書くが、一旦ここにおく マシンスペック iMac使っています。 % system_profiler SPHardwareDataType Hardware: Hardw…

gdbを使ってRuby 2.4.0のライブプロセスの情報を取得してみる

Ruby 2.4.0 リリース 2.4.0がリリースされたので、 spring-mt.hatenablog.com と同じことをやってみようかと思います。 準備 AWSのamazon Linux上で試しています。 # cat /etc/system-release Amazon Linux AMI release 2016.09 gccは 4.8.3、 gdbは7.6.1を…

gdbを使ってRuby(2.3.3)のライブプロセスの情報を取得する

Rubyのプロセスに対して、非破壊的に中をのぞいてみたいことが時々ありますよね???(詰まっているプロセスとか) 今回、gdbを使ってライブプロセスにアタッチして調べてみました。 準備 今回はAWSのamazon Linux上で試しています。 # cat /etc/system-relea…

SideCIの自動rubocop PRが羨ましかったので、自分で作った

blog-ja.sideci.com これを見て。 SideCIはGitHub Enterpriseに対応していない(2016/02/13現在)ので、自分で作った。 github.com サーバー上げて、githubのweb hookに仕込むだけでPRを送ったら、自動的にrubocopで自動修正した内容を別PRにして送ってくれま…

workerの枯渇状況が分かるrack-server_statusというgemを書いています

unicornのwokerのbusy数とidle数の比率がわからなくて、うっかりworkerが枯渇して大変なことになったので、workerの状況を返すエンドポイントを追加するrackミドルウェアを書いています。 SpringMT/rack-server_statusgithub.com ぶっちゃけkazeburoさんのPl…

sinatraで設定したパス一覧を取得する

メモ こんな感じでスクリプトを書いた。 require 'rack' require 'sinatra' class Sinatra::Base private class << self attr_reader :original_routes # なぜかsuperが呼べない... def route(verb, path, options = {}, &block) @original_routes ||= {} (@…

railsで特定のモデルに対してbelongs_toで参照先を設定しているモデルを取り出す

まあ、いろいろ調べる必要がありまして。。。 ざっくりとこんな感じでとれた。 # production環境では要らないが、development環境では必要かと Dir.glob(File.expand_path('./app/models/*.rb', Rails.root)).each do |f| require f end # 定数を全部取得 co…

rubyで局所的にパッチを当てる方法を模索中

下記のようなコードで、Cクラスの中だけで何とかAクラスに対するパッチを当てたい。 class A def self.foo p 'foo' end def bar p 'bar' end end module ExtendFoo refine A.singleton_class do def foo p 'extend foo' end end refine A do def bar p 'exte…

railsアプリでstackprofを使ってボトルネックを探す + JSON::Schema(2.2.1)の高速化

railsアプリが遅いって言われたので、久しぶりにrubyでisuconしてみました。 railsアプリでstackprofを使ったプロファイリング まず、自分がいつもやってる方法なのですが、config.ruにstackprofの設定を仕込みます。 stackprofはrackミドルウェアとして差し…

Webサイトに必要なfaviconが21個になっていたらしいのでrack-favicon_allっての書いた

Webサイトに必要なfaviconが21個になっていた - IT探検記 Webサイトに必要なfaviconが21個になっていた - IT探検記 どうもWebサイトに必要なfaviconが21個もあるらしい。 で@bayashiが 増殖中の favicon を Plack::Middleware ひとつで配信する - @bayashi D…

Faradayでnet/httpのアダプターを使っている場合のHTTPリクエスト/レスポンスを見る

忘れそうなのでメモっておく。 require 'faraday' module FaradayDebug def net_http_connection(env) http = super http.set_debug_output $stderr http end end module Faraday class Adapter class NetHttp prepend FaradayDebug end end end これを書い…

HTMを試す

rubykaigi一日目の発表でHTMを使ったパフォーマンス向上の試みが発表されていたので試してみました。 RubyKaigi 2014 | Eliminating Giant VM Lock in Ruby through Hardware Transactional Memory RubyKaigi 2014 | Eliminating Giant VM Lock in Ruby thro…

stackprofを使ってみる

追記 2014/09/21 FlameGraphの出し方を追記しました 追記 2017/08/13 stackprofの原理をまとめました。 spring-mt.hatenablog.com rubykaigi 2014終わりましたね。 スタッフの皆様、本当にお疲れ様でした。 で、3日目のkeynoteを聞いて、stackprofは使いこな…

Ruby vs Rubinius vs GobiesVM

I benchmark GobiesVM compared with Ruby and rubinius. Rubykaigi2014で紹介されていたGobiesVMを使って、ベンチ取ってみた。 brucehsu/GobiesVM brucehsu/GobiesVM · GitHub Machine Specs % system_profiler SPHardwareDataType Hardware: Hardware Over…

rubykaigi2014 一日目(途中までのメモ)

メモ程度に RubyKaigi 2014 | Building the Ruby interpreter -- What is easy and what is difficult? Ruby Interpreterの責務はクオリティを高めることと考えている。 信頼性、高パフォーマンス、消費リソースが少ない、互換性、拡張性 これらの品質はそれ…