У нас ОЧЕНЬ загруженный кластер серверов. Наши 16 серверов приложений обслуживают наше приложение с локального SSD на каждой машине, но они также обрабатывают изображения, которые затем передаются с нашего компакт-диска. Из-за этого у нас есть пара центральных серверов образов, которые мы монтируем с помощью nfs с наших серверов приложений.
Недавно у нас возникла проблема с серверами изображений, на которых мы должны были их выключить. Ничего страшного, наш CDN по-прежнему будет обслуживать большинство наших изображений, поэтому никто не должен замечать время простоя. Не совсем..
Вместо того чтобы продолжать нормальную работу, серверы приложений резко увеличили нагрузку и вылетели из строя или перестали отвечать. После дня копания мы сузили проблему до монтирования nfs. Несмотря на то, что в монтирование nfs не поступало никаких операций чтения или записи, простой факт, что он не работал, приводил к полному зависанию apache.
Ничего страшного, мы провели небольшое исследование и обнаружили, что монтируем наш том nfs как жесткое крепление, и нам нужно переключиться на мягкое крепление, использовать intr
и задайте как значение timeo, так и значение retr. Мы устанавливаем количество повторов равным 0 и устанавливаем timeo=1
(это в десятых долях секунды, поэтому я считаю, что 1 - это минимально возможное значение). С этими настройками мы отключили серверы образов, чтобы воспроизвести предыдущий сбой, и стали ждать, что же произошло.
Результат был лучше, но только в том, что сбой была не во всей системе, а в том, что обслуживание было настолько медленным, что оно могло также выйти из строя. Кажется, что даже на 1 десятой секунды это слишком долго для тайм-аута монтирования nfs, поэтому мы получаем огромное количество невыполненных соединений в балансировщике нагрузки и, возможно, 1/10 емкости.
Чтобы проверить свой результат, я отключил монтирование nfs с 4 из 16 серверов приложений, и уровни запросов к этим 4 серверам были полностью нормальными.
Итак, есть ли способ установить меньший тайм-аут для монтирования nfs или отключить диск при ошибке и автоматически перемонтировать его после того, как отключенный сервер вернется в сеть? Или есть другое решение, которое я упускаю из виду, которое не добавляет сложности нашей системе?
Первое, что я сделал бы, это установил retrans
вариант 1 (или 0, но я не знаю, будет ли это работать должным образом). Это должно уменьшить время, необходимое для фактического тайм-аута