Что такое соединение через сокет или что говорит нам вывод lsof?
Я передаю некоторые файлы из S3 в экземпляр EC2, чтобы получить сводные данные из заголовков. я использую key.close(fast=True)
для всех ключей, которые я получаю от boto.s3.bucket.Bucket.list()
(библиотека python для доступа к S3), но передайте ссылку на ключи, чтобы я мог прочитать их части, и это работает. Однако иногда я получаю [Errno 24]: слишком много открытых файлов.
Когда я бегу lsof | grep python
Я получаю различные из них:
python 10573 ec2-user 399u IPv4 59221 0t0 TCP ip-10-0-0-113.ec2.internal:59293->s3-1-w.amazonaws.com:https (CLOSE_WAIT)
python 10573 ec2-user 72u IPv4 60910 0t0 TCP ip-10-0-0-113.ec2.internal:37952->s3-1-w.amazonaws.com:https (ESTABLISHED)
и одно из этого:
python 10573 ec2-user 91u sock 0,6 0t0 61105 can't identify protocol
Это веб-серверы? Что означают столбцы? Мне нужно больше исследовать, чтобы понять, как закрыть эти соединения в python, но хочу ли я закрыть эти соединения? Разумнее ли создавать и повторно использовать одно соединение или это неосуществимо? Я выясню сторону Python, когда пойму больше о том, что происходит, это в основном вопрос о том, что происходит.
ulimit -a
говорит, что максимальное количество открытых файлов - 1024, и можно просто поднять его. Тем не менее, я хочу убедиться, что я закрываю файлы, которые должны быть.
1 ответ
Это веб-серверы? [...] я хочу закрыть эти связи?
Это действительно соединения, которые вы установили, и вы должны правильно закрыть хотя бы те, которые отмечены CLOSE_WAIT
(для этого требуется один дополнительный шаг из-за HTTPS-соединения). Если вы делаете много вещей, связанных с HTTPS-сайтами, правильной очистки должно быть достаточно для решения этой проблемы. can't identify protocol
Вероятно, это соединение, которое еще не было полностью установлено (см. вопрос SF, связанный выше, или этот вопрос SO).
Разумнее ли создавать и повторно использовать одно соединение или это неосуществимо?
Да, и это должно быть осуществимо. Это вопрос программирования, хотя.
Что такое соединение через сокет [?]
Сокет обычно определяется как an endpoint for communication
(в man 2 socket
а также man 3 socket
, Это зависит от того, какой именно протокол вы используете.
Что означают столбцы?
В соответствии с man lsof
:
An open file may be a regular file, a directory, a block special file,
a character special file, an executing text reference, a library, a
stream or a network file (Internet socket, NFS file or UNIX domain
socket.) A specific file or all the files in a file system may be
selected by path.
Список столбцов по умолчанию для lsof
является:
$ lsof | head -1
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Вы, кажется, скучаете по TID
(или идентификатор потока) столбец. COMMAND
, PID
а также USER
говорят сами за себя. FD
номер дескриптора файла. 399u
указывает на то, что fd пронумерован 339 (его можно найти на /proc/10573/fd/339
) и имеет доступ как для чтения, так и для записи (u
).
TYPE
IPv4
указывает, что это сокет IPv4 (sock
для сокета неизвестного домена).
DEVICE
вывод для обычных файлов:
Столбец DEVICE сообщает нам, на каком устройстве мы работаем. Два числа называются старшими и младшими. Список хорошо известен и задокументирован. Например, мажорный номер 8 обозначает блочное устройство SCSI. Для сравнения, IDE-диски имеют старший номер 3. Младший номер указывает один из 15 доступных разделов. Таким образом (8,1) говорят нам, что мы работаем над sda1.
(0,16), другое интересное устройство в списке относится к неназванным креплениям без устройства.
Для подробного списка, пожалуйста, смотрите:
http://www.kernel.org/pub/linux/docs/device-list/devices.txt
И этот список (на самом деле по адресу https://www.kernel.org/pub/linux/docs/lanana/device-list/devices-2.6.txt) не очень полезен для устройств с большим номером 0
,
NAME
Поле для таких сокетов:
[...] the local and remote Internet addresses of a network
file; the local host name or IP number is followed by a
colon (':'), the port, ``->'', and the two-part remote
address; IP addresses may be reported as numbers or names, [...]