Я передаю потоком некоторые файлы из 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, связанный выше, илиэтот ТАК вопрос).
Разумнее ли создать и повторно использовать одно соединение или это невозможно?
Да, и это должно быть осуществимо. Но это вопрос программирования.
Что именно представляет собой соединение через сокет[?]
Сокет обычно определяется как 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
указывает, что файловый дескриптор имеет номер 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, [...]