Что такое соединение через сокет или что говорит нам вывод 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 communicationman 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).

TYPEIPv4 указывает, что это сокет 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, [...]
Другие вопросы по тегам