Сетевая ошибка в PASE на компьютере iSeries

Я запускаю серверную программу, написанную на C и работающую в PASE на машине iSeries. PASE (Portable AIX Solutions Environment) — это имитация AIX на компьютерах IBM iSeries.

Серверная программа представляет собой итеративный TCP-сервер, ориентированный на соединение.

Логика сервера содержит вызов accept(), который возвращает дескриптор сокета. За этим следует вызов ioctl() для установки неблокирующего сокета с помощью F_IONBIO.

Этот вызов ioctl периодически терпит неудачу, возвращает -1 с errno = 9 (EBADF: неверный файловый дескриптор) примерно в 0,8% процентов случаев, когда он вызывается. После сбоя для определенного дескриптора сокета следующие сбои всегда будут для одного и того же дескриптора сокета и с одним и тем же errno.

Когда это происходит, клиентская сторона завершается с ошибкой errno = 73, т. е. соединение сбрасывается узлом.

Сервер — это процесс-демон; поэтому stdin закрывается при инициализации и доступен при accept(). Первоначально я заметил, что ioctl() не работает для дескриптора сокета 0, но не всегда. Следовательно, я попытался предотвратить повторное использование дескриптора сокета 0, установив для stdin значение «/dev/null», если это было проблемой. Но я не уверен, что это было главной проблемой. Тем не менее, чтобы получить результаты теста после этого изменения.

Проблема наблюдается только на некоторых машинах и обычно при загрузке машины. Так что это похоже на какое-то состояние гонки. Логика сервера хорошо протестирована и кажется стабильной.

Наблюдались ли какие-либо проблемы, связанные с сокетами, на платформе PASE или AIX? Может ли это быть связано с ОС?

Буду признателен за любую помощь/указания по этой проблеме.

заранее спасибо,

среднее


person avg    schedule 17.05.2011    source источник


Ответы (1)


Есть ли шанс, что вы столкнетесь с максимальным значением по умолчанию в 200 файловых дескрипторов на задание?

Если это так, вы можете использовать DosSetRelMaxFH( ) -- Измените максимальное количество файловых дескрипторов API, чтобы увеличить ограничение.

Если это не проблема, я предлагаю собрать и изучить трассировку сообщений SST об ошибке. Для получения дополнительной информации см. Инструкции по отслеживанию соединений TCP/IP.

Затем я проверю уровни групповых PTF, особенно SF99315 TCP/IP Group PTF.

Служба поддержки IBM действительно помогает в отслеживании подобных проблем.

person James Allman    schedule 04.06.2011
comment
Небольшое примечание. В PASE по умолчанию должно быть 2000. . Значение по умолчанию QShell — 200. - person user2338816; 24.04.2015