Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Как тестировать?


Автор: konshyn 10.3.2015, 15:42
Есть сетевая прилага. Ее нужно протестировать на нагрузку. Понять, почему ограничивается скорость - ethernet-платой или, может, записью информации на диск.
Как вообще проводят тестирование (не функциональное) сетевых утилит?

Автор: tzirechnoy 10.3.2015, 18:30
1) Выясняют, почему им неподходит netperf.
2) Пытаются найти что-нибудь такое жэ, но другое.

Автор: konshyn 11.3.2015, 11:43
Цитата(tzirechnoy @  10.3.2015,  18:30 Найти цитируемый пост)
1) Выясняют, почему им неподходит netperf.
2) Пытаются найти что-нибудь такое жэ, но другое. 

А как измеряют нагрузку на систему (загрузка ОП, загрузка процессора)?
Интересен еще такой факт, как узнать, куда записывается пакет сетевая карта - в оперативную память или сразу в кэш (для эффективного использования процессорного кэша)? 
Как узнать время обработки пакета? Как я понию, то только тесты, написанные вручную, или подойдут утилиты, которые измеряют время работы участка кода? Где-то видел такие, но не понимаю, как работают. Смотрят ли они только написанный пользователем код или считают еще системные вызовы? А что с динамической линковкой?

Добавлено через 6 минут и 14 секунд
И какие есть средства и/или методы, для увеличения производительности?

Автор: bsa 13.3.2015, 11:20
Цитата(konshyn @  11.3.2015,  12:43 Найти цитируемый пост)
Интересен еще такой факт, как узнать, куда записывается пакет сетевая карта - в оперативную память или сразу в кэш (для эффективного использования процессорного кэша)?
вопрос бредовый. К кэшу процессора имеет доступ только сам процессор. Сетевая карта принимает данные в свою внутреннюю память, а потом по требованию выдает. Теоретически возможен вариант, когда сетевуха использует системную память для этого, но не думаю, что в обычных машинах это используется (ради экономии нескольких десятков центов геморроиться с синхронизацией?). Если сетевая карта хоть немного умная (не только PHY), то процессор она грузит по минимуму - ему остается только принимать/передавать готовые пакеты данных (преобразование и проверку целостности производит сама сетевуха, а когда данные готовы, то высылает сигнал процессору).
Цитата(konshyn @  11.3.2015,  12:43 Найти цитируемый пост)
Как узнать время обработки пакета? Как я понию, то только тесты, написанные вручную, или подойдут утилиты, которые измеряют время работы участка кода?
Если речь про твой код, то профилер тебе в помощь (man gprof).
Цитата(konshyn @  11.3.2015,  12:43 Найти цитируемый пост)
Где-то видел такие, но не понимаю, как работают. Смотрят ли они только написанный пользователем код или считают еще системные вызовы?
Профилеровщики считают разницу времени на входе и выходе из твоей функции.
Цитата(konshyn @  11.3.2015,  12:43 Найти цитируемый пост)
А что с динамической линковкой?
А что не так?
Цитата(konshyn @  11.3.2015,  12:43 Найти цитируемый пост)
И какие есть средства и/или методы, для увеличения производительности?
Это все имеет общее название "оптимизация". Для начала включи оптимизацию компиляции (попробуй каждый вариант: -Os, -O2, -O3), если не поможет, то тогда надо с помощью профилеровщика найти узкое место и как-то его ускорить. Возможно, придется применить openmp, opencl или даже ассемблер.

Автор: xvr 13.3.2015, 15:20
Цитата(bsa @  13.3.2015,  11:20 Найти цитируемый пост)
вопрос бредовый. К кэшу процессора имеет доступ только сам процессор.

Как это не странно, вопрос не совсем бредовый  smile У Intel есть технология DCA (Direct Cache Access) в группе http://www.intel.com/content/www/us/en/wireless-network/accel-technology.html, которая позволяет заливать данные с PCIe непосредственно в кэш:
Цитата

Direct Cache Access (DCA) allows a capable I/O device, such as a network controller, to place data directly into CPU cache, reducing cache misses and improving application response times.
Доступно только в серверных чипсетах, и никаких спеков не нее нет (только рекламные брошюры)  smile 


Автор: konshyn 15.3.2015, 22:38
Цитата(bsa @  13.3.2015,  11:20 Найти цитируемый пост)
вопрос бредовый.

я читал про прямой доступ к кэшу http://rus-linux.net/lib.php?name=/MyLDP/hard/memory/memory-6-9.html

Как правильно сказал xvr, у Intel есть такая технология, чего я, к слову, не заметил, что речь идет только про intel, а не все современные процессоры.

Цитата(bsa @  13.3.2015,  11:20 Найти цитируемый пост)
ради экономии нескольких десятков центов геморроиться с синхронизацией?

почему нет, если это не идет в убыток компании, проекту или еще чему-нибудь?
да и тем более, если можно это сделать и проверить, почему бы это не попробовать, если хочется?
Но не об этом спор:)



Цитата(bsa @  13.3.2015,  11:20 Найти цитируемый пост)
Если речь про твой код, то профилер тебе в помощь (man gprof).

Да, про него читал, спасибо:)


Цитата(bsa @  13.3.2015,  11:20 Найти цитируемый пост)
Это все имеет общее название "оптимизация". Для начала включи оптимизацию компиляции (попробуй каждый вариант: -Os, -O2, -O3),

Это понятно. Но это то, на что я не совсем могу влиять. Я могу только компилятору помочь. А вот как помочь, вот об этом и спрашиваю, а не о самих алгоритмах:)
Чтобы было понятнее, вот примеры:
Ключевое слово https://ru.wikipedia.org/wiki/Restrict
или что-то такое
Код

for (int i = 0; i < INF; i++)
    for (int j = 0; j < f(i) * something[i]; j += f(i))
        ...
 
Вот тут выражение 
Код

f(i) * something[i]
 
будет при каждой итерации высчитывать или только один раз?
Если при каждой, то можно ведь сделать так:
Код

for (int i = 0; i < INF; i++) {
    k = f(i) * something[i];
    for (int j = 0; j < k; j += f(i)) {
        ...
    }


Вот о каких-то таких практиках имел ввиду smile
Есть такая организация CERT, где на у них на сайте собраны стандарты по безопасному программированию и книги есть. Вот и подумал, что может есть какой-то ресурс(ы), где что-нибудь собирают подобное для лучшей оптимизации под определенный компилятор. Конечно, меня интересует gcc, но было бы интересно посмотреть и на другие:)

Автор: baldina 16.3.2015, 00:38
Цитата(konshyn @  15.3.2015,  22:38 Найти цитируемый пост)
Вот тут выражение 
код C++
1:
f(i) * something[i]
 
будет при каждой итерации высчитывать или только один раз?
Если при каждой, то можно ведь сделать так:

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

Цитата(konshyn @  15.3.2015,  22:38 Найти цитируемый пост)
для лучшей оптимизации под определенный компилятор

про intel - на сайте intel

Автор: tzirechnoy 16.3.2015, 02:14
Цитата
А как измеряют...


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

Я не знаю, с чего начать отвечать, и вряд ли когда-нибудь соберусь.

Добавлено через 3 минуты и 52 секунды
Цитата
Как узнать время обработки пакета?


Осцыллографом. Я серьёзен -- учитывая буфера карточки, все программные методы требуют слишком хорошэго понимания жэлеза (PCI/конкретная карточка/вот это всё), чтобы пытаться начать выяснять на них этот вопрос.

Впрочем, этот вопрос чаще всего интересует людей для HFT. для всего остального -- измеримого на соседней с испытуемой системе раундтрипа в 200мкс вполне достаточно, а интересует throughput, который ужэ вполне реально померить.

Добавлено через 14 минут и 37 секунд
Цитата
будет при каждой итерации высчитывать или только один раз?


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

Если f(i) -- какая-то достаточно простая функцыя без побочных эффектов (в частности, без записи глобальных переменных, да вроде дажэ и без чтения, хотя здесь я могу ошыбаться, и чтение переменных, не объявленных volatile допускается если там потом в цыкле тожэ всё вычислимо и не изменяет этой жэ переменной), которая определена в том жэ исходнике, что и этот цыкл или вообще является макросом, и something[i] -- не объявлен volatile и не изменяется в теле этого цыкла -- то компилятор можэт решыть, что можно и закэшыровать значение этого выражэния.

Шансов на это, впрочем, не много, и если ты считаешь, что k = f(i)*something[i] будет быстрее -- то лучшэ ставь так.

Впрочем, практика -- критэрий истины...

Да, первые проблемы в скорости, которые обычно надо решать -- алгоритмические. Т.е. O(n^2) где достаточно O(n*log(n)) или наоборот иницыализатор итэратора O(log(n)) занимает большэ, чем в среднем требуется для простого прохода O(n^2).

Потом -- cache locality, оптимизацыя хранения и выборки данных, вот это всё.

Вопросы правильного заполнения конвеера (нужными командами и малым количеством нужных ветвлений) -- идут чаще на третьем месте.

Автор: tzirechnoy 16.3.2015, 02:31
Цитата
А как измеряют нагрузку на систему (загрузка ОП, загрузка процессора)?


Стрэсс-тэстами, чаще всего.

А на боевую систему -- есть top, iotop, несколько других и системы мониторинга (nagios/zabbix/etc), которые рисуют графики и шлют сообщения при перегрузках.

Автор: tzirechnoy 16.3.2015, 02:46
Цитата
куда записывается пакет сетевая карта - в оперативную память или сразу в кэш 


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

Поскольку правильные работает через busmaster или другой DMA, а херовые -- требуют чтобы процэссор читал данные из них по одному слову в каком-нибудь своём исполняющемся потоке.

Автор: xvr 16.3.2015, 16:36
Цитата(konshyn @  15.3.2015,  22:38 Найти цитируемый пост)
где что-нибудь собирают подобное для лучшей оптимизации под определенный компилятор.

Под архитектуру есть - http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf

Автор: korol 4.3.2016, 13:09
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)