Что такое тайм аут потока

Обновлено: 18.05.2024

На iPhone для данной модели регистратора используйте программу iVMS4500.

1. какой порт вбивать? 554?
2. Как изменить кол-во камер в программе? При добавлении устройства невозможно изменить еденичку

Цитата
Guest пишет:
1. какой порт вбивать? 554?
2. Как изменить кол-во камер в программе? При добавлении устройства невозможно изменить еденичку
1. В данной программе нужно указывать порт 8000 (по умолчанию).
2. Данный пункт не является ключевым, после подключения к регистратору, количество камер в программе будет соответствовать реальному значению.

Исправление системного файла Hosts

Теперь перейдем к более сложному методу исправления ошибок, когда может срабатывать тайм-аут операции.

тайм аут операции

Сначала в меню отображения файлов и папок (в стандартном «Проводнике» это меню «Сервис» со строкой «Параметры папок») на вкладке вида необходимо задать показ скрытых папок и файлов.

После вышеуказанной операции необходимо открыть меню «Выполнить» и ввести в строке команду «notepad %windir%\system32\drivers\etc\hosts» (естественно, без кавычек), поле чего в «Блокноте» будет открыт файл Hosts. Обратите внимание: снизу имеется строка «::1 localhost». По идее, она должна быть последней, так что все, что находится ниже нее, нужно удалить, после чего произвести сохранение файла с оригинальным названием и местоположением. Теперь остается только перезагрузить компьютерный терминал. Затем, как правило, ошибка исчезает.

Собираем все вместе

Очередь приема (receive queue) должна быть рассчитана на обработку всех пакетов, полученных через сетевой интерфейс, не вызывая отбрасывания пакетов. Также необходимо учесть небольшой буфер на случай, если всплески будут немного выше, чем ожидалось. Для определения правильного значения следует отслеживать файл softnet_stat на предмет отброшенных пакетов. Эмпирическое правило — использовать значение tcp_max_syn_backlog, чтобы разрешить как минимум столько же SYN-пакетов, сколько может быть обработано для создания полуоткрытых соединений. Помните, что этот параметр задает количество пакетов, которое каждый процессор может иметь в своем буфере, поэтому разделите значение на количество процессоров.

Размер SYN очереди ожидания (SYN backlog queue) на высоконагруженном сервере должен быть рассчитан на большое количество полуоткрытых соединений для обработки редких всплесков трафика. Здесь эмпирическое правило заключается в том, чтобы установить это значение, по крайней мере, на максимальное количество установленных соединений, которое слушатель может иметь в очереди приема, но не выше, чем удвоенное количество установленных соединений. Также рекомендуется отключить SYN cookie, чтобы избежать потери данных при больших всплесках соединений от легитимных клиентов.

Очередь установленных соединений, ожидающих принятия (accept queue) должна быть рассчитана таким образом, чтобы в периоды сильного всплеска трафика ее можно было использовать в качестве временного буфера для установленных соединений. Эмпирическое правило — устанавливать это значение в пределах 20–25% от числа рабочих потоков.

Параметры

В этой статье были рассмотрены следующие параметры ядра:

И следующие пользовательские ограничения:

Тайм-аут операции - что это такое?

Итак, на экране монитора возникает ошибка, сообщающая пользователю о том, что соединение прервано, вернее, время ожидания подключения истекло.

тайм аут операции

В принципе, тайм-аут и можно трактовать как некий временной промежуток, в течение которого система ожидает ответа сервера на собственный отправленный запрос. В системах Windows это параметр установлен по умолчанию, а его значение прописано в сетке системного реестра настроек текущего компьютерного терминала в подразделе SYSTEM, где во вложенных директориях находится подпапка Parameters, где время указано в секундах. Как правило, изменять его не рекомендуется.

Тайм-аут операции: причины возникновения ошибки и методы ее исправления

Достаточно часто многие пользователи ПК, которые так или иначе связаны с Интернетом, а также геймеры, подключающиеся к игровым порталам, наблюдают появление ошибок соединения с сервером. Сейчас мы рассмотрим вопрос о том, что значит тайм-аут операции. Более того, будет предложено несколько основных способов решения этой проблемы.

Заключение

Вот, собственно, и все по поводу срабатывающего тайм-аута. Конечно, можно использовать еще и редактирование системного реестра с заданием большего значения периода ожидания ответа сервера, вот только гарантии, что все остальные ресурсы будут грузиться без проблем, никто дать не может. К тому же, как уже понятно, и сами страницы, если и будут грузиться, то намного дольше. А это ни одному юзеру не нужно.

Причины возникновения ошибки

Причин, когда возникает тайм-аут операции, может быть довольно много. Выделим наиболее часто встречающиеся ситуации. Прежде всего, в качестве основного фактора выступает нестабильное подключение к Интернету, когда постоянно происходит прерывание связи, и система не может получить цельный ответ сервера, к которому в данный момент выполняется подключение.

тайм аут операции что это

В некоторых случаях тайм-аут операции может срабатывать при включенных антивирусных программах или при неправильных настройках брэндмауэра Windows. Как известно, брэндмауэр при настройках по умолчанию способен блокировать достаточно много веб-ресурсов, считая их опасными или содержащими потенциально нежелательные данные. Такое очень часто встречается при подключению к серверам многопользовательских онлайн-игр.

Кроме всего прочего, тайм-аут операции завершает время ожидания подключения при использовании или неправильной настройке прокси-сервера. В данном случае речь идет и о настройках прокси в системе, и об использовании анонимных прокси-серверов, когда пользователь по каким-либо причинам хочет остаться во Всемирной паутине неузнанным, а проще говоря, скрыть истинный IP-адрес своего компьютерного терминала. Рассмотрим несколько основных методов исправления ситуации без вмешательства в системный реестр для выставления более высокого значения периода ожидания.

Настройка сетевого стека Linux для высоконагруженных систем


Приглашаем всех желающих посетить открытый демо-урок «Практикум по написанию Ansible роли». На этом вебинаре участники вместе с экспертом будут писать, тестировать и отлаживать ansible роли. Это важно для тех, кто хочет автоматизировать настройку инфраструктуры, поскольку это один из инструментов, который это позволяет сделать. Сетевой стек — одна из самых запутанных вещей в Linux. И не только из-за сложности некоторых концепций и терминов, но и из-за изменения смысла некоторых параметров в разных версиях ядра. В этой статье приведена информация для ядра 2.2 и выше, а также, там где это возможно, указано различие между версиями вплоть до 5.5.

Очередь приема и netdev_max_backlog

Очередь ожидающих запросов на соединение и tcp_max_syn_backlog

Соединения создаются для SYN-пакетов из очереди приема и перемещаются в очередь ожидания (SYN Backlog Queue). Также соединение помечается как "SYN_RECV" и клиенту отправляется "SYN+ACK". Эти соединения не перемещаются в очередь установленных соединений ожидающих обработки accept() (accept queue) до тех пор, пока не будет получен и обработан соответствующий ACK. Максимальное количество соединений в этой очереди устанавливается параметром net.ipv4.tcp_max_syn_backlog .

Для просмотра очереди приема используйте команду netstat . На правильно настроенном сервере при нормальной нагрузке значение не должно быть больше 1. При большой нагрузке значение должно быть меньше размера очереди ожидания (SYN Backlog):

Если в состоянии "SYN_RECV" находятся много соединений, то можно также подстроить продолжительность нахождения SYN-пакета в этой очереди.

SYN Cookie
Повторы SYN+ACK

Что происходит, если SYN+ACK отправлен, но ответа ACK нет? В этом случае сетевой стек сервера повторит отправку SYN+ACK. Задержка между попытками вычисляется таким образом, чтобы обеспечить восстановление сервера. Если сервер получает SYN и отправляет SYN+ACK, но не получает ACK, то тайм-аут повторной передачи вычисляется по экспоненте (Exponental Backoff) и, следовательно, зависит от количества повторных попыток. Количество повторных попыток отправки SYN+ACK задается параметром ядра net.ipv4.tcp_synack_retries (по умолчанию равно 5). Повторные попытки будут через следующие интервалы: 1с, 3с, 7с, 15с, 31с. При шести попытках последняя будет примерно через 63 секунды после первой. Это позволяет удержать SYN-пакет в очереди ожидания более 60 секунд до истечения времени ожидания пакета. Если очередь SYN backlog мала, то не требуется большого количества соединений, чтобы возникла ситуация, когда полуоткрытые соединения никогда не завершатся и тогда никакие соединения не смогут быть установлены. Установите количество повторных попыток SYN+ACK равным 0 или 1, чтобы избежать такого поведения на высоконагруженных серверах.

Повторы SYN

Несмотря на то что повторные SYN-пакеты отправляются клиентом во время ожидания SYN+ACK, они могут влиять и на высоконагруженные серверы, работающие с прокси-соединениями. Например, сервер nginx, устанавливающий несколько десятков прокси-соединений к бэкенд-серверу, из-за всплесков трафика может на некоторое время перегрузить сетевой стек, а повторные попытки создадут дополнительную нагрузку на бэкэнд как в очереди приема, так и в очереди ожидания (SYN backlog). Это, в свою очередь, может повлиять на клиентские соединения. Повторные попытки SYN контролируются параметром net.ipv4.tcp_syn_retries (по умолчанию 5 или 6 в зависимости от дистрибутива). Ограничьте количество повторных попыток SYN до 0 или 1, чтобы не было долгих повторных попыток отправки в течение 63–130 с.

Более подробно о проблемах с клиентскими соединениями при обратном прокси-сервере читайте в статье Linux Kernel Tuning for High Performance Networking: Ephemeral Ports.

Очередь установленных соединений ожидающих принятия (accept queue) и somaxconn

Очередь запросов на соединение создает приложение, используя listen() и указывая размер очереди в параметре "backlog". Начиная с ядра 2.2 поведение этого параметра изменилось с максимального количества неоконченных запросов на соединение, которое может удерживать сокет, на максимальное количество полностью установленных соединений, ожидающих, пока они будут приняты. Как описано выше, максимальное количество неоконченных запросов на соединение теперь задается с помощью параметра ядра net.ipv4.tcp_max_syn_backlog .

somaxconn и параметр backlog в listen()

Хотя за размер очереди для каждого слушателя отвечает приложение, есть ограничение на количество соединений, которые могут находиться в очереди. Размером очереди управляют два параметра: 1) параметр backlog в функции listen() и 2) параметр ядра net.core.somaxconn , задающий максимальный размер очереди.

Значения по умолчанию для очереди

Значение по умолчанию для net.core.somaxconn берется из константы SOMAXCONN, которая в ядрах Linux вплоть до версии 5.3 имеет значение 128, но в 5.4 она была увеличена до 4096. Однако, на момент написания этой статьи, ядро 5.4 еще не очень распространено, поэтому в большинстве систем значение будет 128, если вы не модифицировали net.core.somaxconn.

Часто приложения для размера очереди по умолчанию используют константу SOMAXCONN, если этот размер не задается в конфигурации приложения. Хотя некоторые приложения устанавливают и свои значения по умолчанию. Например, в nginx размер очереди равен 511, который автоматически усекается до 128 в ядрах Linux до версии 5.3.

Изменение размера очереди

Многие приложения позволяют указывать размер очереди в конфигурации, указывая значение параметра backlog для listen() . Если приложение вызывает listen() со значением backlog , превышающим net.core.somaxconn, то размер очереди будет автоматически усечен до значения SOMAXCONN.

Потоки

Соединения и файловые дескрипторы

Системные ограничения

Любое сокетное соединение использует файловый дескриптор. Максимальное количество дескрипторов, которые могут быть созданы в системе, задается параметром ядра fs.file-max. Посмотреть количество используемых дескрипторов можно следующим образом:

Пользовательские ограничения

Помимо системного ограничения количества файловых дескрипторов, у каждого пользователя есть свои лимиты. Они настраиваются в системном файле limits.conf (nofile) или, при запуске процесса под управлением systemd, в unit-файле systemd (LimitNOFILE). Чтобы увидеть значение по умолчанию запустите:

Для systemd (на примере nginx):

Настройка

Для настройки системных ограничений установите параметр ядра fs.max-file в максимальное количество файловых дескрипторов, которое может быть в системе (с учетом некоторого буфера). Например:

Для настройки пользовательского лимита установите достаточно большое значение, чтобы хватило сокетам и файловым дескрипторам рабочих процессов (также с некоторым буфером). Пользовательские ограничения устанавливаются в /etc/security/limits.conf, в conf-файле в /etc/security/limits.d/ или в unit-файле systemd. Например:

Количество worker'ов

Аналогично файловым дескрипторам, количество worker'ов или потоков, которые может создать процесс, ограничено как на уровне ядра, так и на уровне пользователя.

Системные ограничения

Процессы могут создавать рабочие потоки. Максимальное количество потоков, которые могут быть созданы, задается параметром ядра kernel.threads-max . Для просмотра максимального и текущего количества потоков, выполняющихся в системе, запустите следующее:

Пользовательские ограничения

Есть свои ограничения и у каждого пользовательского процесса. Это также настраивается с помощью файла limits.conf (nproc) или unit-файла systemd (LimitNPROC). Для просмотра максимального количества потоков, которое может создать пользователь запустите:

Для systemd (на примере nginx):

Настройка

Как и в случае с nofile , ограничения для пользователей ( nproc ) устанавливаются в /etc/security/limits.conf, в conf-файле в /etc/security/limits.d/ или в unit-файле systemd. Пример с nproc и nofile :

Обратный прокси и TIME_WAIT

При большом всплеске трафика прокси-соединения, застрявшие в "TIME_WAIT", суммарно могут потреблять много ресурсов при закрытии соединения. Это состояние говорит, что клиент получил последний FIN-пакет от сервера (или вышестоящего worker'а) и находится в ожидании для корректной обработки пакетов. Время нахождения соединения в состоянии "TIME_WAIT" по умолчанию составляет 2 x MSL (Maximum Segment Length — максимальная длина сегмента), что составляет 2 x 60 с. В большинстве случаев это нормальное и ожидаемое поведение, и значение по умолчанию в 120 с вполне приемлемо. Однако много соединений в состоянии "TIME_WAIT" может привести к тому, что приложение исчерпает эфемерные порты для соединений к клиентскому сокету. В этом случае следует уменьшить FIN тайм-аут.

Управляет этим тайм-аутом параметр net.ipv4.tcp_fin_timeout . Рекомендуемое значение для высоконагруженных систем составляет от 5 до 7 секунд.

Тайм-аут операции: что делать? Простейший способ исправления ситуации

Как считается, наиболее простым способом, позволяющим избавиться от ошибки 118, является обычное закрытие не отвечающей страницы и ее повторное открытие по истечении минут десяти. Иногда может потребоваться закрыть и перезапустить сам интернет-браузер (часто такие ситуации почему-то наблюдаются в Google Chrome и других браузерах на его основе).

тайм аут операции что делать

Достаточно эффективным может оказаться решение проблемы, связанное с внесением, допустим, игрового сайта в список разрешений (исключений) антивируса и брэндмауэра, тем более что в обоих случаях в настройках сделать это не так уж и сложно.

Как ограничить время работы потока?

В ExecutorService треды переиспользуются в этом и вся суть этих пулов.
Каждую задача что вы кидаете например Runnable попадает в очередь и потом выполняется ексекютором когда какой нибудь тред освободится.

Если посмотреть на названия тредов в екзекуторе - они будут примерно такими pool-2-thread-4
Достучатся до треда в котором выполняется ваш код, вы можете прям из Runnable или Callable смотря что вы там скармливаете executor'y


Если хотите прервать тред по каким то причинам, то примерно так.
Thread.currentThread().interrupt();

Но в случае с InputStream это не освободит поток. Чтобы поток освободился, чтото должно заметить, что его интерраптнули.

IzeBerg

Ну это я знал, а как по времени ограничить его работу (потока)?

@IzeBerg У вас же код в методе run выполняется последовательно, засекайте время ответа от сервера - если оно больше того что вам нужно - останавливайте тред.

Или можете смотреть сколько вообще тред занимает cpu времени


и так же останавливайте.

Или сделайте задачу, которая будет проверять ваши треды раз в N времени на затраченное время как я описал выше getThreadCpuTime и прибивать их.

@IzeBerg Если вам нужно именно по таймауту всё делать, то используйте Callable и Future как вам предложили выше.

Там есть два метода

Вызов первого метода get() устанавливает блокировку до тех пор, пока не завершится вычисление. Второй метод генерирует исключение TimeoutException, если истекает таймаут до завершения вычислений. Если прерывается поток, выполняющий вычисление, оба метода генерируют исключение InterruptedException. Если вычисление уже завершено, get() немедленно возвращает управление.

@IzeBerg То бишь, каждый вызов стороннего ресурса выносите в отдельный Callable и в своём Runnable где уже вы их вызываете, пробуйте получить ответ вызвав get.(1, TimeUnit.SECONDS);

IzeBerg

Мне нужно именно сам поток обработки запроса останавливать. Т.е. тот, который получается при подключении клиента и отправки его обработки в ExecutorService. Если он (не зависимо какие идут действия занимает слижком много времени - то просто забить на клиента и освободить поток) @bimeg Извиняюсь, вы имели ввиду InputStream подключённого по соккету клиента. Я думал InputStream от обращения к стороннему сервису.

@IzeBerg я не думаю что вы найдёте такой Executor где у тредов есть TTL ( Time To Live ) по истечению которого он убьёт тред - ибо это влечёт за собой кучу ошибок и не освобожденные ресурсов.

Вы должны сами отслеживать сколько времени тред работает и если это выходит за ваши рамки убивать его, предварительно освободив ресурсы.

Как узнать сколько времени работает треад - я написал выше.
Если этот метод вам не подходит:
Можно банально записывать в Runnable в переменную long stratTime = время когда началось выполнение и потом сравнивать с вашим значением.
Или записывать время когда клиент подключился - тут смотря какая у вас логика.

Если бы вы привели пример вашего кода, можно было бы что то придумать, как это реализовать.

Использовать таймаут соединения - если долго то забивать на клиента. Или NIO - там можно обрабатывать соединение без блокировок (и как бонус можно заводить один поток на несколько клиентов).

IzeBerg

Таймаут соединения не катит, поток-то не очистится. Мне нужно именно под каждого клиента свой поток и каждому потоку таймаут выполнения, после которого поток останавливается и очищается (будет супер, если еще и соединение с клиентом закроется). Если у вас Executor то он сам следит за потоками. Зачем их убивать? Пусть себе крутятся, ведь Executor умеет их переиспользовать. Вам важно прервать выполнение вашей задачи которую вы засабмитили в Executor. Вот об том я и написал.

IzeBerg

Т.е. просто поставить тайм-аут на сокет (который после Listener.accept();)? Или как?

Не вполне знаю что за Listener, но обычно так:
Socket.setSoTimeout(milliseconds);

Тогда InputStream будет кидаться IOException'ами если клиент не отвечает дольше чем таймаут.

IzeBerg

ServerSocket Listener = new ServerSocket(CONNECTION_PORT);

Сейчас потестил, поставил на сокет (который клиента) таймаут в 1 мс (Socket.setSoTimeout(1);) - никаких ошибок, хотя среднее время на выполнение тестовых запросов (все одинаковые)

305 мс..
Что не так?

Хым. Либо я гдето ошибся либо сам сокет у вас не тупит, а тупит чтото другое. Проверю свои слова как до дому доберусь.

IzeBerg

Эм, вы пытаетесь достучатся до сокета-сервера, у которого тайм-аут на прием соединений - зачем? Мне нужно, чтобы сервер, получив клиента создал ему поток, а этот поток по истечению N-ого кол-ва миллисекунд/секунд завершил свое выполнение по таймауту. У вас-же таймаут тоит не там, сервер после таймаута просто не может принять клиентов. 1) Тайм аут не на прием соединения а на ИО с клиентского сокета
2) Поток не услышав ответа от клиента в тетчение 100мс закончился с исключением.
3) Видимо я не понял что вы хотите на самом деле. Можно запускать эти задачи асинхронно. В loop'е или экзекуторе должна быть функция запуска задачи с таймером.

IzeBerg

Не. В джаве так не выйдет. И Future тут ваще никоим образом не поможет. Для похожего нужно юзать NIO. @bimeg Почему не подходят? Future вроде бы как раз и позволяет запускать асинхронно куски кода.
V get(long timeout, TimeUnit unit) позволяет ставить таймер на исполнение кода. Ну если так, то можно. Но это уже будет какойто велосипед, учитывая что давно есть нужные средства для non-blocking IO. Так вроде это вещи из разных классов. Future нужен, чтобы не ждать результата, т.е. он обеспечивает возможность вызывать функции асинхронно. А NIO - это неблокирующее IO. В nio-сокетах можно ведь запустить Future на выполнение? Если во future не использовать блокирующие операции, то всё будет асинхронно.
Или я ошибаюсь?

Асинхронность дает не Future а Executor (thread pool). Future лишь позволяет другому потоку получить некие знания о состоянии задачи которая вполняется на worker thread'е.

Далее если я правильно понял вашу мысль, то есть Executor и некий поток который имеет массив Future'ов и в цикле обходит их и дергает get с таймаутом. И если какойто затупил то прибивает его. В контексте вопроса это не вполне хорошее решенее, помоему. Ибо get не дает узнать изза чего произошел затуп (клиент долгий или какието вычилсения) т.е. есть шанс прибить поток безосновательно.

Nio же позволяет одному потоку держать несколько коннешконов и безблокировки (не в смысле в отдельном потоке, а в смысле "если нечего читать еще то зачем ждать") в цикле их обходить и он же узнает, что один их них затупил по таймауту и тогда его можно убрать из очереди. Тогда не нужен лишний поток для обслуживания Future'ов. Да и сами Future'ы тоже не нужны вероятно.

Изменение параметров прокси-сервера

Несколько сложнее обстоит дело с настройками прокси в системе. Рассмотрим в качестве примера стандартный Internet Explorer. В браузере нужно использовать раздел «Свойства обозревателя» и вкладку «Подключения».

что значит тайм аут операции

Снизу имеется кнопка «Настройка сети», после нажатия на которую будет произведен вход в окно настройки параметров локальной сети. Здесь достаточно просто снять галочку (флажок) со строки «Использовать прокси-сервер» и сохранить изменения (иногда можно отключить прокси для локальных адресов).

Но вот если подключение производится при помощи прокси, для установки правильных настроек лучше обратиться к провайдеру.

Заключение

Все параметры в этой статье приведены в качестве примеров и не должны вслепую применяться на ваших продакшн-серверах без тестирования. Есть и другие параметры ядра, которые влияют на производительность сетевого стека. Но в целом, это наиболее важные параметры, которые я использовал при настройке ядра для высоконагруженных систем.

Читайте также: