Я играю с настройками ets и специально с read_concurrency
. Я написал простой тест, чтобы оценить, как эта настройка влияет на производительность чтения. Варианты испытаний: here и there.Ets read concurrency tweak
Вкратце, этот тест последовательно создает три [public, set]
ETs таблицы с различными read_concurrency
опциями (без каких-либо ухищрений, с {read_concurrency, true}
и с {read_concurrency, false}
). После создания одной таблицы тестовые прогоны N
читателей (N
- мощность 2 от 4 до 1024). Затем читатели выполняют произвольные чтения в течение 10 секунд и сообщают, сколько операций чтения они выполнили.
Результат для меня довольно удивителен. Нет абсолютно никакой разницы между 3 этими тестами. Вот результат теста.
Non-tweaked table 4 workers: 26610428 read operations 8 workers: 26349134 read operations 16 workers: 26682405 read operations 32 workers: 26574700 read operations 64 workers: 26722352 read operations 128 workers: 26636100 read operations 256 workers: 26714087 read operations 512 workers: 27110860 read operations 1024 workers: 27545576 read operations Read concurrency true 4 workers: 30257820 read operations 8 workers: 29991281 read operations 16 workers: 30280695 read operations 32 workers: 30066830 read operations 64 workers: 30149273 read operations 128 workers: 28409907 read operations 256 workers: 28381452 read operations 512 workers: 29253088 read operations 1024 workers: 30955192 read operations Read concurrency false 4 workers: 30774412 read operations 8 workers: 29596126 read operations 16 workers: 24963845 read operations 32 workers: 29144684 read operations 64 workers: 29862287 read operations 128 workers: 25618461 read operations 256 workers: 27457268 read operations 512 workers: 28751960 read operations 1024 workers: 28790131 read operations
Так мне интересно, как я должен реализовать свой тест, чтобы увидеть разницу и понять, USECASE для этой оптимизации?
Я запустить этот тест на следующих установках:
- 2-ядро, 1 физический процессор, Эрланга/ОТП 17 [ГЭР-6.1] [64-битный] [SMP: 2: 2] [асинхронными -threads: 10] [hipe] [kernel-poll: false] (пример тестового вывода из этого прогона)
- 2-ядерный, 1 физический процессор, Erlang/OTP 17 [erts-6.1] [64-разрядный ] [smp: 2: 2] [async-threads: 10] [hipe] [kernel-poll: true]
- 8-ядерный физический процессор, Erlang/OTP 17 [erts-6.4] [источник] [64- бит] [smp: 8: 8] [async-threads: 10] [hipe] [kernel-poll: false]
- 8-ядерный 1 физический процессор, Erlang/OTP 17 [erts-6.4] [источник] [64-бит] [smp: 8: 8] [async-threads: 10] [hipe] [kernel-poll: true]
- 64-ядерный 4-ядерный процессор, Erlang/OTP 17 [erts-6.3] [источник] [64-разрядный] [smp: 64: 64] [async-threads: 10] [hipe] [kernel-poll: false ]
- 64-ядерный 4-ядерный процессор, Erlang/OTP 17 [erts-6.3] [источник] [64-бит] [smp: 64: 64] [async-threads: 10] [hipe] [kernel-poll: true]
Существует все то же (кроме, конечно, абсолютных значений измерений). Так может кто-нибудь сказать мне ПОЧЕМУ? И что мне делать, чтобы увидеть какую-либо разницу?
UPD По ответ Фреда, я обновил my test, чтобы избежать рабочих обмолота почтового ящика. К сожалению, существенных изменений в результатах не произошло.
UPD One another реализация в соответствии с @Pascal советом. Теперь все рабочие правильно высевают свои случайные генераторы. Снова такие же результаты.
Одно замечания об использовании 'случайного: мундир/1': как вы нерест отдельных процессов без инициализации случайных семян (а значение, хранящееся молча в словаре процесса), все ваши процессы будут выполнять одну и ту же последовательность, но, возможно, это специально: o) – Pascal
Смешная попытка =) Я попытался выровнять случайный генератор для каждого рабочего с помощью «erlang: now/1» , но никаких изменений снова нет. –
Если вы вызываете random: seed (Seed) в каждом процессе, это работает. erlang: now() гарантирует возврат разных значений при каждом вызове, будьте осторожны, чтобы не вызывать его до его появления. – Pascal