The long jobs suffocate the smaller jobs since they fight over the same resources.
I can suggest that you run two sidekiq processes, each using a different config file, and each listening to a different queue:
sidekiq_long.yml
:
:concurrency: 10
:queues:
- default
sidekiq_normal.yml
:
:concurrency: 3
:queues:
- web
This way one sidekiq process will always be available to server short jobs:
sidekiq -C config/sidekiq_long.yml.yml
sidekiq -C config/sidekiq_normal.yml