Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Slow/sub-optimal file lookup #243

Closed
pch opened this issue May 25, 2015 · 1 comment
Closed

Slow/sub-optimal file lookup #243

pch opened this issue May 25, 2015 · 1 comment

Comments

@pch
Copy link

pch commented May 25, 2015

Hi,

First of all I'm not sure it's the right place to post this. I'm not even sure if it's actually a bug or simply the way asset pipeline works. Anyway, here's the problem:

In the project I'm working on, asset compilation has been taking a huge amount of time (1-2mins). Since we're using @import 'compass' rather than sprockets' require, whenever an SCSS file changes, rails recompiles everything - including compass. It's a fairly large projects with a bunch of dependencies, but still 1-2minutes is quite a significant amount of time. I've been trying to track down why it's taking so long - so far with little success.

However, when I attached dtruss to the rails process, it revealed that a considerable chunk of that time is spent on looking for compass files. It basically checks for compass files in every possible asset directory in load_path.

To give you an idea how it looks:

93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/_compass.css.sass\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/compass.css.sass\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/_compass.css.sass.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/compass.css.sass.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/_compass.css.scss\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/compass.css.scss\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/_compass.css.scss.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/compass.css.scss.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/_compass.sass\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/compass.sass\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/_compass.sass.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/compass.sass.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/_compass.scss\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/compass.scss\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/_compass.scss.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/images/compass.scss.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.css\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.css\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.css.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.css.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.css.sass\0", 0x7FFF595C4768, 0x7FFF595C17F0)         = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.css.sass\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.css.sass.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)         = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.css.sass.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.css.scss\0", 0x7FFF595C4768, 0x7FFF595C17F0)         = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.css.scss\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.css.scss.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)         = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.css.scss.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.sass\0", 0x7FFF595C4768, 0x7FFF595C17F0)         = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.sass\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.sass.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)         = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.sass.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.scss\0", 0x7FFF595C4768, 0x7FFF595C17F0)         = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.scss\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/_compass.scss.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)         = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/javascripts/compass.scss.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/plugins/_compass.css\0", 0x7FFF595C4768, 0x7FFF595C17F0)      = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/plugins/compass.css\0", 0x7FFF595C4768, 0x7FFF595C17F0)       = -1 Err#2
93963/0xab888:  lstat64("/Users/piotrek/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/mediaelement_rails-0.8.0/app/assets/plugins/_compass.css.erb\0", 0x7FFF595C4768, 0x7FFF595C17F0)

Here's the whole (filtered) output from dtruss (around 2.8mb, 15215 calls to lstat64 just for compass files): https://gist.github.com/pch/f41bb68316339877faad

Is this a bug/something that can be improved?

We're running Rails 4.2 (recently upgraded from 4.0.x). I have yet to do a comparison with the old version, but the problem got bigger after the upgrade.

@mleszcz
Copy link

mleszcz commented May 25, 2015

+1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants