Russian Qt Forum
Ноябрь 23, 2024, 22:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема коннекта к серверу под нагрузкой  (Прочитано 3320 раз)
garryHotDog
Гость
« : Октябрь 07, 2010, 20:09 »

Для более ясной картины опишу что за сервер и как работает (Это линуксовый сервак для раздачи файлов)

- qtcpserver
- qtcpsocket (используются асинхронный режим работы - не блокирующийся)
- qt462
- ubuntu 9.10
- qtcreator

Алгоритм работы:

1. К серваку подключается клиент - я создаю новый сокет для работы с клиентом (напомню сокет асинхронный).
2. Когда приходит запрос от клиента на закачку файла - нахожу это файл или его часть в рабочей директории (в данном случае это другой сервак - т.к. файлов там на 100Gb)
3. "Отдаю" файл или его часть клиенту - и отключаюсь от него.

В чем проблема:
через некоторое время  - время коннекта к серваку (например по telnet) сильно возрастает или невозможно подключиться к нему вообще..

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


Жду от форумчан каких нибудь соображений по этой проблемке! Заранее спасибо!
Записан
merke
Гость
« Ответ #1 : Октябрь 08, 2010, 07:40 »

Знакомая проблема! Запросы становятся в очередь. Решение использовать многопоточность! QThread!!!
Записан
garryHotDog
Гость
« Ответ #2 : Октябрь 08, 2010, 09:09 »

как вариант - я уже написал многопоточную версию...но проблема в том что в Линуксе поток очень тяжелый объект поэтому приходится ограничивать их....а для заказчика - ограничение клиентов - большая беда....может кто нибудь знает как уменьшить размер потока (используемой памяти) в Линуке.... пробовал изменять размер стека - не особо помогло!
Записан
Barmaglodd
Гость
« Ответ #3 : Октябрь 08, 2010, 11:50 »

Сделай не "один поток-одно соединение", а "один поток-несколько соединений". Разбивай файл на маленькие кусочки, чтобы остальные клиенты имели возможность обработаться, вынеси загрузку файла в отдельный поток.
Ну и традиционная бестолковая рекомендация: "Надо было использовать соответствующие инструменты, а не Qt".
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Октябрь 08, 2010, 15:07 »

но проблема в том что в Линуксе поток очень тяжелый объект....

Хм, первый раз об этом слышу, можно поподробнее? Что в нем такого тяжелого
Записан

Гугль в помощь
garryHotDog
Гость
« Ответ #5 : Октябрь 08, 2010, 18:13 »

Да я сам особо не понимаю, просто создай например 100-300 потоков и запусти их (например посылать данные на сервер) и посмотри сколько памяти хавается!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 23.