Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сигналы из треада в треад слишком медленные 
:(
    Опции темы
box
Дата 25.10.2013, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



всем привет!
запускаю в бесконечном цыкле блокировку/разблокировку из одного треада другого, тобиш поидее на максимальной скорости для данной платформы
Код

....
    std::unique_lock<std::mutex> lk(cv_m);
....
    cv.wait(lk, [](){return i == 1;});
....


так максимальное количество блокировок/разблокировок всего навсего до 300 в сек, с чем это связанно и как с этим бороться ?
PM MAIL   Вверх
Cheloveck
Дата 26.10.2013, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Цитата(box @  26.10.2013,  00:52 Найти цитируемый пост)
с чем это связанно и как с этим бороться ? 

Связано это с тем, что мьютексы работют в режиме ядра. А переход из пользовательского режима в ядерный -- это очень дорогая операция. Бороться можно по-разному. Например, использовать спинлок для быстрых операций.
Мьютексы (и другие ядерные блокировки, да и не ядерные) следует использовать как можно реже. Желательно, чтобы у тебя было одно место для синхронизации. 
Если требуется блокировок много и часто -- это 100% проблема архитектуры приложения!

Это сообщение отредактировал(а) Cheloveck - 26.10.2013, 00:26


--------------------
user posted image
PM Jabber   Вверх
tzirechnoy
Дата 26.10.2013, 04:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



А у меня -- 140000 передач в секунду. Вообще -- что за манера -- выкидывать безсвязные куски кода? 
Казалось бы, у вас проблема в скорости -- ну, сделайте пример, замерьте скорость -- нет -- появятся две безсвязные строчки, в которых ещё из семи имён три -- неясно что, и которые в принцыпе не будут что-нибудь делать без симметричного ответчика.

Код

#include <cstdio>
#include <mutex>
#include <thread>
#include <condition_variable>
#include <chrono>


using namespace std;
using namespace chrono;


mutex m;
condition_variable cv;
int var;
high_resolution_clock::time_point start;

void f1(int n) {
    unique_lock<mutex> lk(m, defer_lock);
    while(1) {
        lk.lock();
        cv.wait(lk, [n]{ return var != n;});
        printf("Running thread %d, tcode %g sec\n", n,
                duration_cast<duration<double>>(high_resolution_clock::now()
                                                -start) );
        var = n;
        lk.unlock();
        cv.notify_all();
    };

}

int main(void) {
    var = 0;
    start = high_resolution_clock::now();
    thread t1(f1, 1);
    thread t2(f1, 2);
    t1.join();
    t2.join();
    return 0;
}


Компилировал и запускал: 
Код
0_ilan@azor /tmp%g++ -std=c++11 -lpthread 1.cpp
0_ilan@azor /tmp%./a.out >/var/tmp/t1.txt
^C
130_ilan@azor /tmp%grep 'tcode 4\.' /var/tmp/t1.txt|wc
 141488  848928 5077876

(до ^C после запуска подождал большэ 5 секунд -- чтобы четвёртая секунда вся записалась.)
В файле t1.txt должно быть что-то вида: 
Код
Running thread 1, tcode 0.000136 sec
Running thread 2, tcode 0.000257 sec
Running thread 1, tcode 0.000295 sec
Running thread 2, tcode 0.000332 sec


Система -- Debian/stable, gcc -- Debian 4.7.2-5, ABI amd64, AMD Athlon™ II X4 651 Quad-Core Processor 3 GHz, памяти хватает, ничего не делает.
PM MAIL   Вверх
box
Дата 26.10.2013, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



140к тоже мало , ибо при поступлении каждого пакета должен генериться запуск нужных треадов для их обработки 
это получается что выше 140к пакетов в сек мы не прыгнем 

PM MAIL   Вверх
box
Дата 26.10.2013, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



кстати у меня результат намного выше с вашим примером , хотя цель была другая , у вас реализованна конкурентная блокировка а мне надо из одного процесса запускать другой с максимальным кол-вом обращений в сек (в идеале надо 15 млн что соотвествало бы 10G ethernet):
 1813133 10878804 65241088
на двухголовом ксеоне 2х6 ядер и фряха 10-я

Это сообщение отредактировал(а) box - 26.10.2013, 05:22
PM MAIL   Вверх
vinter
Дата 26.10.2013, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

Связано это с тем, что мьютексы работют в режиме ядра.

Это далеко не факт. Всё зависит от реализации. 
Любые блокировки это дорого, поэтому нужно задачи решать без оных. Тем более когда важна производительность.


--------------------
Мой блог
PM MAIL WWW   Вверх
box
Дата 26.10.2013, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



и как вы предлагаете защитить контейнер типа unordered_map
PM MAIL   Вверх
vinter
Дата 26.10.2013, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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


--------------------
Мой блог
PM MAIL WWW   Вверх
box
Дата 26.10.2013, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



скиньте пожалуйста ссыдку на пример использования spin_lock
PM MAIL   Вверх
tzirechnoy
Дата 26.10.2013, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
а мне надо из одного процесса запускать другой с максимальным кол-вом обращений в сек (в идеале надо 15 млн что соотвествало бы 10G ethernet):


Нельзя просто так взять и обработать 10G Ethernet.


Если серьёзно -- то 10G сейчас не будет выбирать полную полосу дажэ просто на прерываниях. Не, ну если задаться цэлью -- то наверное ужэ можно поставить спортивный рекорд (считать надо), а чтобы в жызни работало -- не будет. Соответственно, о переключении в userspace на каждый пакет можно забыть, о такой дорогой операцыи как рождение трэда -- тем более.
То есть только поллинг, только обработка большой пачки пакетов за фиксированное (небольшое) число сисколлов.

Цитата
на двухголовом ксеоне 2х6 ядер и фряха 10-я


Ну, у меня и комп -- рабочий десктоп, ему почти пять лет по-моему.
PM MAIL   Вверх
box
Дата 26.10.2013, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



между прочим у нетмап скорость доступа к юзер спейсу состовляет всего 65 тактов процессора , тобиш он способен уже при одном ядре и 900 мгц выдавать нагора 15млн пакетов в сек (проверял на игбшной гиговой карте в один поток и частоте 2.4 ггц при загрузке треада всего в 20.0 генерит 1.5 млн пакетов в сек на легке) так же обстоят дела и с захватом пакетов , там используется мемори мапинг и прямой доступ к сетевому интерфейсу а в режиме зеро копи вообще творит чудеса , берем из rxring пакет , анализируем и меняем местами индексы rxring и txring и пакет уходит по назначению либо в стек либо в сеть , так что остается только найти способ многопоточной обработки всего что попало в юзер спейс с минимальными потерями на блокировках 
PM MAIL   Вверх
vinter
Дата 26.10.2013, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



всё давно уже найдено: в Windows это IO Completion port, в unix мире не уверен, но насколько слышал это epoll. Никто не работает с сетью посредством самостоятельной диспетчеризации соединений между потоками т.к. это не лучший способ реализации, мягко гояоря.


--------------------
Мой блог
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.