Дизайн для быстрой загрузки страницы - PullRequest
0 голосов
/ 28 мая 2010

У меня есть файл с миллионами URL-адресов / IP-адресов, и мне нужно написать программу, чтобы действительно быстро загружать страницы. Скорость соединения должна быть не менее 6000 / с, а скорость загрузки файлов не менее 2000 с avg. Размер файла 15кб. Пропускная способность сети составляет 1 Гбит / с.

Мой подход до сих пор был следующим: создание 600 потоков сокетов, каждый из которых имеет 60 сокетов, и использование WSAEventSelect для ожидания чтения данных. Как только загрузка файла будет завершена, добавьте этот адрес памяти (загруженного файла) в конвейер (простой вектор) и выполните другой запрос. Если общая загрузка всех потоков сокетов превышает 50 МБ, запишите все файлы, загруженные на диск, и освободите память. До сих пор этот подход был не очень успешным с той скоростью, с которой я мог достичь, не стреляя выше 2900 соединений / с и загружая скорость передачи данных еще меньше.

Может кто-нибудь предложить альтернативный подход, который мог бы дать мне лучшую статистику. Также у меня работает windows server 2008 с 8 Гб памяти. Также нам нужно взломать ядро, чтобы мы могли использовать больше потоков и памяти. В настоящее время я могу создать макс. из 1500 потоков и использования памяти, не превышающей 2 гигабайтов (что технически должно быть намного больше, поскольку это 64-битная машина). И о IOCP не может быть и речи, поскольку у меня пока нет такого опыта, и я должен исправить это приложение сегодня.

Спасибо, ребята!

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Прежде всего вам необходимо выяснить, что ограничивает ваше приложение. Вы связаны с процессором, с IO, с памятью, с сетью, ...? Есть ли конфликт между вашими потоками? и т.д ...

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

0 голосов
/ 28 мая 2010

Я не вижу никакого увеличения производительности при использовании дополнительных сокетов. Для одного процессора он должен «делиться» выполнением кода между различными сокетами, разделяя производительность. То же самое верно для слишком большого количества потоков.

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

Большая часть узкого места (ИМХО) - это получение пакетов данных и анализ их мест назначения. Чем больше таких аналитиков, тем выше ваша производительность; хотя у вас могут быть проблемы с производительностью, когда один или несколько директоров хотят использовать одну и ту же область памяти (два директора загружают одну и ту же страницу).

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

"Это только мое мнение, я могу ошибаться." - Деннис Миллер .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...