Skip to content

Instantly share code, notes, and snippets.

@sonots
Last active August 29, 2015 14:06
Show Gist options
  • Select an option

  • Save sonots/44b62561cc7f7a0007c6 to your computer and use it in GitHub Desktop.

Select an option

Save sonots/44b62561cc7f7a0007c6 to your computer and use it in GitHub Desktop.
なんで gem install こんなに遅いん?

ruby 2.0.0p195

$ gem install chef-provider-service-daemontool -V
HEAD https://rubygems.org/latest_specs.4.8.gz
302 Moved Temporarily
HEAD https://s3.amazonaws.com/production.s3.rubygems.org/latest_specs.4.8.gz
304 Not Modified
ERROR:  Could not find a valid gem 'chef-provider-service-daemontool' (>= 0) in any repository
HEAD https://rubygems.org/prerelease_specs.4.8.gz
302 Moved Temporarily
HEAD https://s3.amazonaws.com/production.s3.rubygems.org/prerelease_specs.4.8.gz
304 Not Modified
HEAD https://rubygems.org/specs.4.8.gz
302 Moved Temporarily
HEAD https://s3.amazonaws.com/production.s3.rubygems.org/specs.4.8.gz
304 Not Modified
ここで12秒ぐらいかかる

strace してみる. syscall じゃわからなさそう

$ strace -f -s0 gem install chef-provider-service-daemontool -V
[pid 15338] brk(0xd31c000)              = 0xd31c000
[pid 15338] brk(0xd340000)              = 0xd340000
[pid 15338] brk(0xd364000)              = 0xd364000
[pid 15338] brk(0xd388000)              = 0xd388000
[pid 15338] brk(0xd3ac000)              = 0xd3ac000
[pid 15338] brk(0xd3d0000)              = 0xd3d0000
ここで12秒ぐらいかかる

tmm1 氏の rbtrace 仕込んでみる

$ gem install rbtrace
$ bundle exec which gem
/home/sonots/.rbenv/versions/haikanko/bin/gem
$ vim /home/sonots/.rbenv/versions/haikanko/bin/gem
+ require 'rbtrace'
$ gem install chef-provider-service-daemontool -V
$ rbtrace -p $(ps -ef | grep -v grep | grep gem | awk '{print $2}') --firehose | grep Gem
...
Gem::NameTuple#match_platform? <0.000938>
Gem::Text#levenshtein_distance
Gem::Text#levenshtein_distance <0.000195>
Gem::NameTuple#match_platform?
  Gem::Platform.match
    Gem.platforms <0.000085>
  Gem::Platform.match <0.000682>
Gem::NameTuple#match_platform? <0.000861>
Gem::Text#levenshtein_distance
Gem::Text#levenshtein_distance <0.000212>
Gem::NameTuple#match_platform?
  Gem::Platform.match
    Gem.platforms <0.000119>
  Gem::Platform.match <0.000861>
Gem::NameTuple#match_platform? <0.001166>
Gem::Text#levenshtein_distance
Gem::Text#levenshtein_distance <0.000271>
Gem::NameTuple#match_platform?
  Gem::Platform.match
    Gem.platforms <0.000081>
  Gem::Platform.match <0.000647>
Gem::NameTuple#match_platform? <0.000808>
Gem::Text#levenshtein_distance
Gem::Text#levenshtein_distance <0.000124>
Gem::NameTuple#match_platform?
  Gem::Platform.match
    Gem.platforms <0.000080>
  Gem::Platform.match <0.000582>
Gem::NameTuple#match_platform? <0.000713>
Gem::Text#levenshtein_distance
Gem::Text#levenshtein_distance <0.000128>
Gem::NameTuple#match_platform?
  Gem::Platform.match
以下ループ

ここかな https://github.com/ruby/ruby/blob/trunk/lib/rubygems/spec_fetcher.rb#L186-L206

@sonots
Copy link
Copy Markdown
Author

sonots commented Sep 25, 2014

typo してると全 gem 探索して一番近いやつを見つけてくれるらしい。それに 12s ほどかかる。

$ gem install chef-provider-service-daemontools -V

と正しくいれたらすぐ抜けた ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment