ユーザーのアバターを保存するために、 CarrierWave (0.9.0)、Fog ( 1.14.0 )、および S3 を使用しています。特定のユーザーのアバター URL を決定するのに時間がかかっているようです。2 回目以降の通話時間は大幅に短縮されます。
config/initializers/fog.rb
CarrierWave.configure do |config|
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
}
config.fog_directory = ENV['AWS_S3_BUCKET_AVATAR']
config.fog_public = false
end
user.rb
mount_uploader :avatar, ImageUploader
コンソール
irb(main):002:0> Benchmark.measure { user.avatar_url }
=> 0.500000 0.020000 0.520000 ( 0.537884)
irb(main):003:0> Benchmark.measure { user.avatar_url }
=> 0.000000 0.000000 0.000000 ( 0.001830)
irb(main):004:0> Benchmark.measure { user.avatar_url }
=> 0.000000 0.000000 0.000000 ( 0.001454)
irb(main):005:0> Benchmark.measure { user.avatar_url }
=> 0.000000 0.000000 0.000000 ( 0.000998)
New Relic のレポートには、user.avatar_url
最大 1 秒かかる場合があります。これが非常に遅い原因は何ですか? 公開ファイルの遅い URL 生成に関する議論がありますが、私のアバターは公開されていません。
更新 1:
最初の呼び出しの前に Fog と CarrierWave を明示的に要求しても、false
返されるように違いはなく、それらが既に読み込まれていることを示します。
irb(main):002:0> require 'carrierwave'
=> false
irb(main):003:0> require 'fog'
=> false
irb(main):004:0> Benchmark.measure { user.avatar_url }
=> 0.510000 0.030000 0.540000 ( 1.627774)
更新 2:
アップローダは次のとおりです。
# encoding: utf-8
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
storage :fog
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :s_32 do
process resize_to_fill: [32, 32]
end
version :s_40 do
process resize_to_fill: [40, 40]
end
version :s_50 do
process resize_to_fill: [50, 50]
end
version :s_115_120 do
process resize_to_fill: [115, 120]
end
version :s_128 do
process resize_to_fill: [128, 128]
end
def extension_white_list
%w(jpg jpeg gif png)
end
end
更新 3:
user.avatar.url
違いはないようです:
irb(main):003:0> Benchmark.measure { user.avatar.url }
=> 0.500000 0.030000 0.530000 ( 0.926975)