2016-06-28 2 views
2

Мое приложение использует магазин redis, который работает нормально локально, но в производстве, используя Phusion Passenger (с открытым исходным кодом) Я столкнулся с этой ошибкой.Errno :: EMFILE (Слишком много открытых файлов - сокет (2)) при использовании RedisStore для кеширования во время работы в Пассажире

Errno::EMFILE (Too many open files - socket(2)): 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/connection/ruby.rb:24:in `initialize' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/connection/ruby.rb:24:in `initialize' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/connection/ruby.rb:143:in `new' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/connection/ruby.rb:143:in `connect_addrinfo' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/connection/ruby.rb:187:in `block in connect' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/connection/ruby.rb:185:in `each' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/connection/ruby.rb:185:in `each_with_index' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/connection/ruby.rb:185:in `connect' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/connection/ruby.rb:260:in `connect' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:336:in `establish_connection' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:101:in `block in connect' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:293:in `with_reconnect' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:100:in `connect' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:364:in `ensure_connected' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:221:in `block in process' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:306:in `logging' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:220:in `process' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:120:in `call' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis.rb:862:in `block in get' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis.rb:58:in `block in synchronize' 
/usr/local/rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis.rb:58:in `synchronize' 
vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis.rb:861:in `get' 
vendor/bundle/ruby/2.2.0/gems/redis-store-1.1.7/lib/redis/store/interface.rb:5:in `get' 
vendor/bundle/ruby/2.2.0/gems/redis-store-1.1.7/lib/redis/store/marshalling.rb:17:in `get' 
vendor/bundle/ruby/2.2.0/gems/redis-activesupport-4.1.5/lib/active_support/cache/redis_store.rb:230:in `block in read_entry' 
vendor/bundle/ruby/2.2.0/gems/redis-activesupport-4.1.5/lib/active_support/cache/redis_store.rb:212:in `call' 
vendor/bundle/ruby/2.2.0/gems/redis-activesupport-4.1.5/lib/active_support/cache/redis_store.rb:212:in `with' 
vendor/bundle/ruby/2.2.0/gems/redis-activesupport-4.1.5/lib/active_support/cache/redis_store.rb:230:in `read_entry' 
vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.6/lib/active_support/cache.rb:413:in `block in exist?' 
vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.6/lib/active_support/cache.rb:547:in `block in instrument' 
vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.6/lib/active_support/notifications.rb:166:in `instrument' 
vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.6/lib/active_support/cache.rb:547:in `instrument' 
vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.6/lib/active_support/cache.rb:412:in `exist?' 
vendor/bundle/ruby/2.2.0/gems/redis-activesupport-4.1.5/lib/active_support/cache/redis_store.rb:200:in `exist?' 

Мой кэш код инициализации

Rails.application.configure do 
    Rack::MiniProfiler.config.storage_options = { host: 'redis.local.com', port: 6379 } 
    Rack::MiniProfiler.config.storage = Rack::MiniProfiler::RedisStore 
    config.cache_store = :redis_store, http://redis.local.com:6379, { expires_in: 5.minutes } 
    Rails.cache = ActiveSupport::Cache::RedisStore.new 
end 

Обыскав все над Redis-ПУЭ и Redis-магазин драгоценных камней, не появился вообще ничего. Как обеспечить, чтобы пассажир не создавал несколько соединений с Redis при использовании в качестве хранилища кешей?

ответ

0

Это не проблема пассажира. Это ваше приложение попадает в лимит дескриптора файла. Почему он достигает предела? Не знаю - возможно, это должно открыть много файловых дескрипторов, или, возможно, вы пропускаете дескрипторы файлов где-то. Одна вещь, которую вы можете попробовать, - это увеличение passenger_app_file_descriptor_ulimit, но это помогает только в том случае, если ваше приложение действительно должно использовать множество дескрипторов файлов, а не утечку их. Если ваше приложение просачивает их, остается только отлаживать ваше приложение, чтобы узнать, откуда происходят утечки.

+0

Это не может быть ограничение дескриптора файла. Поскольку хранилище кешей - это Redis, и поэтому нет файлов. – absessive

+0

«Файловый дескриптор» в unix относится не только к обычным файлам в файловой системе. Сокеты TCP, которые используются для связи с Redis, также являются файловыми дескрипторами. Кроме того, ядро ​​прямо говорит, что вы нажимаете ограничение на дескриптор файла (через код ошибки EMFILES). Таким образом, вы фактически нажимаете лимит дескриптора файла. – Hongli

+0

Как проверить и предотвратить достижение этого предела? – absessive

Смежные вопросы