Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток, у меня следующая проблема. У меня есть список типа vector<string>, в котором приблизительно 25 000 строк, суть программы в следующем, нужно в потоках обработать данные строки(строка представляет собой домен для последующего получения ip адресов), как можно быстрее. На данный момент, программа ругается в тот момент, как вызывается первый экземпляр объекта потока, а именно в следующем строке: pthread_join(threads[0], NULL); , дальше не идет программа, в чем может быть проблема? Вот ошибка: dpi kernel: [ 3366.211960] dpi[11554]: segfault at 4 ip b76dc056 sp bf809700 error 6 in libpthread-2.19.so[b76d6000+18000] Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:27 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
ariasУ меня есть список типа vector<string>, в котором приблизительно 25 000 строк Это vector<string> domains ? Попробуй оставить 25 строк. Будет работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:39 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Непонятно где инстнциируется &tattr. Может это необязательно но хотелось-бы чтоб сорс был самодостаточный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:42 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
И... не знаю реально-ли стартовать 25 тыщ потоков. Тут по идее должнен быть какой-то диспетчер типа Круглый-Робин. А так по коду получается что на каждый домен будет форкнут тред. И + надо анализировать коды возврата. Возможно там где-то что-то падает. http://man7.org/linux/man-pages/man3/pthread_create.3.html On success, pthread_create() returns 0; on error, it returns an error number, and the contents of *thread are undefined. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:51 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Можешь потоки на std::thread переделать, там синтаксис попроще и приведение типов не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:51 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Просто не надо создавать 25000 потоков ))) Переделайте алгоритм, чтобы потоков было достаточное, но небольшое число. Например 2*число CPU. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:53 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, я думаю что для Linux не очень сложно создать 25 тыщ потоков. Просто ... как-то умеючи надо. Покурить там текущее значение /proc/sys/kernel/threads-max. Покурить откуда оно ставит дефолт. Возможно там какая-то оценочная формула есть. От мемори там или от версии ядра. Но конечно постановка - причудливая. Какой-то DNS сервер.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:00 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
maytonAnatoly Moskovsky, я думаю что для Linux не очень сложно создать 25 тыщ потоков. Каждому потоку 1 Мб стэка надо выделить, это 25 Гб адресного пространства. ХЗ выделит ли столько ОС для одного процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:04 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonAnatoly Moskovsky, я думаю что для Linux не очень сложно создать 25 тыщ потоков. Каждому потоку 1 Мб стэка надо выделить, это 25 Гб адресного пространства. ХЗ выделит ли столько ОС для одного процесса. Мы не знаем какое там выделение. Возможно отложенное. У тебя линухЪ под рукой? Глянь плиз чему у тебя равна эта переменная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:06 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:13 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Ну... всего-лишь в 4 раза меньше Кстати чортов homepage Сергея Брина мне подсказывает что размер стека можно "уплотнить". Волшебная функция нам в помошь. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:16 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
По поводу "&tattr" описался, когда писал сообщение, в реальном коде этого куска уже нет давно. Вроде установка 20 потоков решило проблему, я пытался экспериментировать с количеством одновременных потоков, хотя сколько примеров не смотрел, нигде не описано максимальное чисто одновременных потоков. По поводу максимального числа потоков в системе у меня следующий вывод: Код: plaintext 1. 2. Всем спасибо, буду дальше разбираться с кодом. Сложно вспоминать C++, после того, как пару лет пришлось писать на PHP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 17:29 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
ariasПо поводу "&tattr" описался, когда писал сообщение, в реальном коде этого куска уже нет давно. Было-бы очень продуктивно приводить актуальный исходник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 17:39 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
ariasхотя сколько примеров не смотрел, нигде не описано максимальное чисто одновременных потоков. Одновременно может выполняться столько потоков, сколько логических процов доступно ОС. Где-то их 2 где-то 40 и больше. Если в очереди на исполнение больше, то это только вызовет лишние тормоза из-за переключения потоков. Потом зависит от того что твои потоки делают, если поток ждет ввод/вывод, то в это время проц может другой поток поработать. Создание потока тоже не дешевое действие, поэтому обычно делают пул потоков, которые висят и ждут задания, есть задание - обработали, дальше ждут. Как у тебя написано: создать поток ради пары строк кода, это как купить квартиру чтобы разок переночевать. Почитай какую-нибудь книжку про многопоточность. Это нездоровая строчка Код: plaintext 1. в современном С++ это можно, но при больших n будут проблемы, т.к. массив создается на стэке, а стэк всего 1Мб. маленькие массивы можно так делать, а с большими аккуратно, лучше заменить на vector. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 18:11 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Дим ты не совсем прав. Твоя формула "логических процов" справедлива для численных методов. Но ты открой свой собственный диспетчер задач и посмотри сколько процессов и сколько потоков в каждом (если Windows). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 18:20 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
maytonДим ты не совсем прав. Твоя формула "логических процов" справедлива для численных методов. я формулы не давал, попытался объяснить что универсальной формулы нет, а для конкретного приложения ее надо выводить с учетом особенностей приложения, может не очень понятно написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 19:05 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Если выкинуть всякий лишний мусор типа логгирования то поток делает 1 единственный полезный вызов Код: plaintext 1. и его архитектуру следует обсуждать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 19:16 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
maytonи его архитектуру следует обсуждать. Тут обсуждать особо нечего, надо самодельный запрос DNS-серверу. Тут протокол DNS надо поизучать чтоб не слать 25000 UDP пакетов. Вроде по TCP тоже можно. 1 поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 19:30 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Вики пишет Протокол DNS использует для работы TCP- или UDP-порт 53 для ответов на запросы. Традиционно запросы и ответы отправляются в виде одной UDP-датаграммы. TCP используется, когда размер данных ответа превышает 512 байт, и для AXFR-запросов. Да тут надо раскурить особенности протокола и подстроить под него софт. Тоесть не DDOS-ить бедного провайдера а настроить некую номинальную скорость при которой нет шейпинга и авто-ограничителей. Я-бы еще обратил внимание на возможные дубли доменов. Кстати используя свойство распределённости DNS, запросы можно слать во много направлений пока хватает сетевого канала. Это КМК более благоприятный путь оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 19:48 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
ИМХУ не тот случай. Слать на ближайший. 25000 запросов это не много, не DDoS. Чуть нагрузят сервер, но максимум за секунду на все ответит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 20:07 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
25 тысяч пакетов.... вобе стороны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 20:56 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
Можно попробовать поднять локальный DNS, и спрашивать у него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 21:06 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
maytonне очень сложно создать 25 тыщ потоков Шею себе сломать тоже не сложно, и что? ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 22:46 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
mayton25 тысяч пакетов.... вобе стороны. Чтобы обрабатывать 100К пакетов объемом 1Гбит в секунду хватает недорогого 4 ядерного проца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 22:54 |
|
||
|
Linux C++ потоки
|
|||
|---|---|---|---|
|
#18+
ТС уже "отвалился", но, никто из отвечающих, не выспросил у него: "а на фейхуа" ему собирать DNS-info многопорочно :). Получение информации ограничено скоростью канала. И наплевать на то, сколько потоков (процессов) стучится в него с запросами . Ибо создание и запуск процессов в Linux ныне (на современных процессорах) заведомо быстрее ответов от DNS сервера. Получается от кучи процессов профита нет, а ОЗУ кушаем. И то, если настройки ядра ОС позволят столько процессов (потоков) создать и, соответственно, запустить. Функция gethostbyname( как, справедливо заметил mayton, единственно payload в приведенном фрагменте кода), помнится, синхронная? Еще минус в копилку "кучи процессов", опять же из-за памяти. А поднятие локального DNS не очень-то похоже на здравый совет, ибо задача, обрисованная ТС, оченно похожа на "кеширующий DNS на этапе построения таблицы". В итоге: неизвестно, чего хотел ТС, но советы от Dima_T, mayton довольно во многом применимы. Сказанное Анатолием (Anatoly Moskovsky) может и должно (но не все) быть принято к сведению. Засим откланиваюсь, ибо не совсем трезв. Поздравьте нас (я, сестра и зять) с рождением нового Тамерлана ;). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 00:05 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39260491&tid=2018450]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 180ms |

| 0 / 0 |
