К inetd или не к inetd… когда я должен использовать inetd для своей программы сетевого сервера?
-
23-08-2019 - |
Вопрос
Может ли кто-нибудь дать краткий набор реальных соображений, которые повлияли бы на выбор того, использовать inetd для управления программой, которая действует как сетевой сервер?
(Если используется inetd, я думаю, это изменяет требования к сетевому коду в программе, поэтому я думаю, что это определенно связано с программированием, а не с общим)
Вопрос основан на реализации, которую я видел, которая использует управляющую программу, управляемую inetd, для запуска сетевого прослушивателя, который затем работает вечно и принимает постоянную и тяжелую нагрузку.Это не показалось мне подходящим для профиля использования учебника inetd (по требованию, редко используемый, легкий), и меня заинтересовал более общий вопрос.
Решение
Это зависит от схемы использования вашего сервиса.Если время запуска вашего демона невелико, и вы ожидаете, что он будет использоваться нечасто, то inted может подойти.Это уменьшает или даже устраняет необходимость написания какого-либо дополнительного сетевого кода.
Если ваш демон более тяжелый или чаще используется, вам, вероятно, лучше написать его автономно.Вы можете так же легко написать init.d
сценарий и некоторые conf.d
настройте его вместе с этим, и администратору не будет сложнее управлять им.Большинство языков программирования в наши дни имеют простые в использовании библиотеки сокетов, так что во многих случаях сетевой код может быть даже не таким уж сложным.
По своему опыту я обнаружил, что в наши дни мало кто из администраторов знаком с inetd.Большинство демонов просто предоставляют свой собственный сценарий инициализации.На самом деле, из нескольких сотен систем, которыми я управляю, я не могу вспомнить ни одной, которая вообще запускала бы что-либо через inetd.Это то, над чем стоит задуматься.
Другие советы
Подключение к inetd немного упростит управление вашим сервисом с операционной точки зрения, поскольку inetd позволяет системному администратору контролировать практически все, как происходит сетевое взаимодействие с вашей программой.Однако для этого вам потребуется внести несколько изменений в код вашей программы.Кроме того, это может быть не так эффективно, как просто заставить вашу программу запускаться как демон для начала.
Редактировать:Лично я никогда не использую inetd и всегда предпочитаю писать серверные процессы как автономные демоны.
Я думаю, что еще одним фактором, который стоит учитывать при принятии решения об использовании inetd, является то, сколько памяти в среднем потребляет процесс, обрабатывающий запрос?Если это значение достаточно велико, то при высокой нагрузке вы рискуете исчерпать память (поскольку inetd разветвляется).Один и тот же сервер может быть реализован многопоточным способом или методом опроса с возможностью выбора, что, возможно, обеспечивает более высокую нагрузку / меньший объем памяти на одно соединение.
Какую альтернативную стратегию вы рассматриваете?
inetd - это хороший способ гарантировать, что ваш сервер запустится при загрузке операционной системы на соответствующем уровне запуска.Даже если вы спроектируете свой сервер так, чтобы на нем был какой-то другой механизм управления, inetd все равно может довольно просто обернуть все команды.В конце концов, это всего лишь сценарии оболочки.