Не хочется говорить банальные вещи, но ИМХО необходимость блокировки сессий и при этом отказ от привязки ip пользователя к конкретному серверу это признак ошибки в архитектуре.
Подумайте, возможно стоит часть данных из сессии вынести в базу? Ту самую часть, которая так критична к блокировкам.
Вообще странно, что при такой нагрузке у вас возникают проблемы. Каково количество сессий в момент блокировки?
Как вы работаете с сессиями? Стандартный обработчик, или таки что-то свое в session_set_save_handler, но тоже работающее с файлами?
Есть стойкое ощущение, что сессия по каким-то причинам не освобождается. Может быть поможет register_shutdown_function('session_write_close'); Хотя я так и не понял из документации какой в этом смысл, но зачем-то session_register_shutdown было придумано…
Еще я бы на вашем месте покурил
www.php.net/manual/ru/function.session-write-close.php, а точнее комментарии к ней. ИМХО там описано пару кейсов которые могут оказаться вашими.
Один раз я встретил очень забавный случай, который приводил к проблемам с сессиями на относительно небольшой нагрузке — в одном проекте сессии инициировались не только там где было уместно, но и даже в статики. Про генерируемые картинки, которым сессии были вообще не нужны я вообще молчу…
Попробуйте в session_set_save_handler сделать логирование открытий/закрытий, уничтожений вызовов мусорщика и т.п. Может быть это даст вам ключ к пониманию проблемы.
В любом случае я бы вам советовал уходить в базу. Это более масштабируемо, управляемо и т.п. Я конечно понимаю, что транзакции в сессиях это перебор, но мы пока так и не увидели ваш кейс, может быть когда будут детали удастся что-то лучше придумать.