Зависают потоки намертво

jaowoo

Client
Регистрация
09.07.2020
Сообщения
39
Благодарностей
10
Баллы
8
Доброго времени всем,
Последнее время мучает такая проблема. Запускаю сервер на 40 потоков, вебмайлер на кубиках. Какое-то время все работает нормально, далее кажется прокси начинают подвисать, в результате получается такая картинка. Потоки открыты, висят в памяти, но так как коннект к соксу утерян, поток не реагирует вообще ни на что. Может зависнуть половина потоков. Пытаюсь прервать - ноль эмоций. Отвисет через пару минут и тогда только поток закрывается. Потом открывается новый, работает какое-то время, зависает. Если поток не прырывать и не выключать, сокс может отвиснуть через 10 минут, какое-то действие скрипт совершит и дальше опять зависает.

Прощу помощи. Как вычислять такие зависшие прокси и оперативно закрывать зависшие потоки ?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 338
Благодарностей
9 087
Баллы
113
Потом открывается новый, работает какое-то время, зависает.
В проекте есть циклическая работа?
На сколько циклов?
Можно перезагружать инстанс между заданным количеством итераций цикла.
Но лучше не зацикливать или зацикливать минимально.
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Если я верно понял вопрос, то примерно так можно попробовать:
Воспользоваться классом HttpWebRequest в c#, для выполнения http запросов с установкой таймаута. Задаем свойстово Timeout в этом классе.
Примерно так:
C#:
var request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 5000; // Установка таймаута в 5 секунд
Если запрос не выполнится за это время, то получим исключение WebException, которое можно обработать.
Допустим закрыть зависший поток.
C#:
try {
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Timeout = 5000;
    var response = request.GetResponse();
    // Обработка ответа
}
catch (WebException ex) {
    if (ex.Status == WebExceptionStatus.Timeout) {
        // Таймаут
        // Закрытие зависшего потока
    }
    else {
        // Другая ошибка
    }
}
Либо использовать механизм многопоточности, чтобы каждый поток проверял доступность своего прокси-сервера и при необходимости закрывался.
Допустим, создаем отдельный поток для проверки доступности прокси-сервера и передаем в него данные о прокси-сервере и пороговом значении таймаута:
C#:
void ProxyCheckerThread(string proxyHost, int proxyPort, int timeoutThreshold)
{
    while (true) {
        try {
            var request = (HttpWebRequest)WebRequest.Create("http://ваш сайт");
            request.Timeout = timeoutThreshold;
            request.Proxy = new WebProxy(proxyHost, proxyPort);
            var response = request.GetResponse();
        }
        catch (WebException ex) {
            if (ex.Status == WebExceptionStatus.Timeout) {
                // Таймаут
                // Закрытие зависшего потока
            }
            else {
                // Другая ошибка
            }
        }
    }
}
Затем запускаем несколько потоков для выполнения задач с использованием прокси-сервера:
C#:
for (int i = 0; i < numThreads; i++) {
    var thread = new Thread(() => {
        ProxyCheckerThread(proxyHost, proxyPort, timeoutThreshold);
    });
    thread.Start();
}
Где-то могу ошибаться, подправьте под себя
 
  • Спасибо
Реакции: jaowoo

Camorra

Client
Регистрация
22.11.2022
Сообщения
34
Благодарностей
7
Баллы
8
При полной загрузке открой диспетчер задач. Может у тебя сторонний софт нагружает проц на 100%. или ОЗУ. Какое железо на сервере? И линк проверь. Может у сервера регулярные проблемы с интернетом
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)