вторник, июня 29, 2010

Тестирование производительности memcached, redis, hazelcast с java-клиентами

Недавно с моим коллегой, Артемом Наумовым, для одного веб-проекта на java (Spring MVC) выбирали внешний сетевой in-memory cache. Обратили внимание на три проекта: Memcached 1.4.0, Redis 1.2.6, Hazelcast 1.8.5. Первые два это сишные проекты под GCC, Hazelcast - на java. Для Memcached был использован клиент jmemcached, для Redis - jredis, для Hazelcast - стандартный явовский клиент. При тестировании Hazelcast в зачет шел второй прогон, для уверенности что ява-машина разогрета.

Все сервера были установлены на одну железку. На java написаны идентичные клиентские тесты для каждого из серверов и запускались на другой железке. Между железками сетка шириной в 1 гигабит.

Кеш-сервер представлял из себя следующее:
Железка: AMD Atlon 64 X2 Dual Core Processor 3800+, 2 Гб оперативной памяти
ОС: CentOS 5.5 ядро 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:35 EDT 2010 i686 athlon i386 GNU/Linux
Ява: Java(TM) SE Runtime Environment (build 1.6.0_20-b02)

В кеш загоняли 1 млн. записей. Каждая запись - кастомно сериализованный в байты Java class, состоящий из 6 полей по 8 байт (2 long + 4 double) + 1 String от 50 до 400 символов. Чтение производилось многопоточно - в 1, 10, 50, 100, 500 потоков. В каждом потоке синхронно делалось по 100 запросов. При чтении в 1 поток делалось 10000 запросов. В общем все в соответствии со следующей таблицей:
1 поток - 10000 запросов
10 потоков - 100 запросов в каждом
50 потоков - 100 запросов в каждом
100 потоков - 100 запросов в каждом
500 потоков - 100 запросов в каждом

По результатам строились гистограммы времени отклика. По одной оси количество запросов в процентах, по другой миллисекунды. Интерпретация следующая - если при 0.2 мс значение в процентах 60, это означает что этот сервер успевает 60% всех запросов обработать за 0.2 мс.
Нотация в легенде "наименование-сервера_количество-потоков_количество-запросов-в-каждом", т.е. jredis_10_100 означает что тестировался jredis, нагрузка в 10 потоков, к каждом потоке по 100 запросов.

Итак, самая главная картинка




Как видно, самые большие и ярко выраженные пики - это чтение в один поток. Кто бы сомневался, что тут все будет просто отлично. Redis и Memcached показывают отличную и примерно одинаковую производительность - успевают за 0.20-0.23 мс обработать 50-55% всех запросов. Hazelcast отстает в два раза - 40% за 0.40-0.43 мс. В случае увеличения потоков на чтение распределение более пологое, без ярких провалов. Тут Redis и Memcached также показывают примерно одинаковые распределения из которых следует, что большая часть запросов будет обработана за время до 0.5 мс. Заметно выделяется по производительности Memcached на 10 потоков - там 15% запросов пройдут за 0.2 мс. При всех проигрышах по времени в два раза Hazelcast показывает почти идеальное нормальное распределение с медианой около 0.42 мс вне зависимости от количества потоков. В этом смысле он более детерминирован в части ожидаемого отклика, нежели остальные.

Вот табличный вариант. Интервалы с шагом 0.025 мс от 0 до 1 мс . Значения - это количество откликов в заданном интервале в процентах. В сумме проценты меньше 100, понятно, что эта разность реализовалась где-то после 1 мс.

Интервал, мсjmemcached_1_10000jmemcached_10_100jmemcached_50_100jmemcached_100_100jmemcached_500_100jredis_1_10000jredis_10_100jredis_50_100jredis_100_100jredis_500_100hazelcast_1_10000hazelcast_10_100hazelcast_50_100hazelcast_100_100hazelcast_500_100
0000000000000000
0,025000000000000000
0,05000000000000000
0,075000000000000000
0,1000000000000000
0,1250,070,40,660,380,21000,060,050,0400000
0,150,962,46,265,844,940,120,50,920,960,7500000
0,1752,811,99,225,824,180,845,86,525,154,7400000
0,249,654,817,412,0111,3653,447,16,86,035,900000
0,22536,16313,868,67,4542,948,211,68,348,97000,040,020,03
0,252,597,28,489,5610,60,726,16,126,996,380,030,30,380,360,21
0,2752,256,16,668,078,120,3410,59,27,988,080,11,10,980,850,79
0,31,7512,15,567,79,070,2311,48,348,78,90,141,51,161,51,05
0,3251,928,85,15,886,50,248,36,77,317,511,082,32,582,491,86
0,350,96,43,645,025,480,295,15,386,587,252,335,55,025,184,75
0,3750,184,13,684,754,820,184,64,985,235,427,759,99,589,169,55
0,40,314,42,483,563,770,294,44,25,255,1540,8812,915,412,6715,35
0,4250,153,42,063,363,950,074,23,744,564,4137,1411,113,2611,0912,42
0,450,063,31,762,163,390,073,133,633,365,896,46,727,248,11
0,4750,072,91,31,892,320,043,12,623,052,752,685,65,44,874,88
0,50,043,11,021,891,760,012,32,42,512,30,623,93,984,023,87
0,5250,033,21,261,691,280,040,71,91,922,060,253,43,563,323,35
0,550,013,80,921,331,090,032,31,361,581,470,191,63,13,412,91
0,5750,022,40,841,130,840,0211,221,641,440,173,93,023,032,72
0,60,0230,540,990,810,021,31,021,281,320,223,52,682,853
0,62502,20,320,740,71010,860,9810,162,91,92,632,23
0,6501,40,30,550,490,010,50,740,790,940,011,71,51,731,56
0,67501,60,260,50,4300,40,760,670,810,032,21,31,421,3
0,70,010,80,360,540,5500,90,90,690,570,020,811,10,99
0,72500,70,220,510,4200,60,680,660,640,011,30,781,021,04
0,7501,10,260,440,3600,50,640,390,5101,20,861,070,83
0,77500,40,180,350,3900,80,60,490,550,051,50,81,11,01
0,800,20,160,390,360,010,70,280,380,560,060,60,680,840,83
0,8250,010,50,140,280,170,010,60,30,420,310,050,70,640,720,79
0,8500,10,080,220,240,020,40,180,30,1500,80,380,770,66
0,87500,20,120,230,190,010,20,240,310,2400,80,440,540,58
0,900,40,080,250,1400,20,30,240,260,010,30,420,360,34
0,9250,010,20,10,20,0900,10,30,160,220,0100,380,410,45
0,9500,20,080,180,0700,40,260,270,170,010,30,60,470,43
0,97500,20,180,150,1400,40,240,180,2600,30,240,370,42
100,30,120,230,0900,20,20,290,20,020,30,440,40,34



В общем и целом вердикт простой - Redis и Memcached имеют одинаковую производительность при использовании простого базового API уровня get-put. Можно выбирать любой, помня, впрочем, что функционал Redis более обширен. Hazelcast в качестве кеша проигрывает в два раза по скорости и в три по памяти, но у него есть свои плюсы: интероперабельность, широкая функциональность для реализации базовых распределенных структур на java.

Теперь, немного консольной фактуры. Гистограммы по каждому тесту отдельно, тесты естественно идентичные, но другие прогоны, поэтому числа могут отличаться. В большинстве случаев на один тест дается две гистограммы, одна по всей кривой распределения, другая - уточняющая пики.
Это интересно не только для того, чтобы подтвердить статистически значимые результаты, но и для показа того, насколько отдельные запросы могут тормозить. Видно, например, что отдельные единичные запросы в Memcached могут тормозить и выполняться до 379 мс. Это тот случай, когда имеет смысл вводить очень жесткие таймауты на время чтения из кеша.

Memcached
1 thread 10000 requests
Histogram data:
        elements: 10000
        min: 0,110953 ms, max: 1,027573 ms
        max x steps: 25, density per x step: 400,000000
        dx: 100000
-----------------------------------------------------------------
 |                          |     0,11 ms -     0,11 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |++++++++++++++++++++      |     0,11 ms -     0,21 ms |   8048 ( 80,48%)
 |++++                      |     0,21 ms -     0,31 ms |   1531 ( 15,31%)
 |+                         |     0,31 ms -     0,41 ms |    398 (  3,98%)
 |                          |     0,41 ms -     0,51 ms |     11 (  0,11%)
 |                          |     0,51 ms -     0,61 ms |      5 (  0,05%)
 |                          |     0,61 ms -     0,71 ms |      4 (  0,04%)
 |                          |     0,71 ms -     0,81 ms |      0 (  0,00%)
 |                          |     0,81 ms -     0,91 ms |      2 (  0,02%)
 |                          |     0,91 ms -     1,01 ms |      0 (  0,00%)
 |                          |     1,01 ms -     1,11 ms |      1 (  0,01%)
-----------------------------------------------------------------
 |                          |     1,11 ms -     1,11 ms |      0 (  0,00%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 10000
        min: 0,110953 ms, max: 1,027573 ms
        max x steps: 25, density per x step: 400,000000
        dx: 12000
-----------------------------------------------------------------
 |                          |     0,11 ms -     0,15 ms |    174 (  1,74%)
-----------------------------------------------------------------
 |                          |     0,15 ms -     0,16 ms |    198 (  1,98%)
 |                          |     0,16 ms -     0,17 ms |    130 (  1,30%)
 |                          |     0,17 ms -     0,18 ms |    142 (  1,42%)
 |+++++                     |     0,18 ms -     0,19 ms |   2059 ( 20,59%)
 |+++++++++++               |     0,19 ms -     0,21 ms |   4462 ( 44,62%)
 |+++                       |     0,21 ms -     0,22 ms |   1133 ( 11,33%)
 |                          |     0,22 ms -     0,23 ms |    122 (  1,22%)
 |                          |     0,23 ms -     0,24 ms |    133 (  1,33%)
 |+                         |     0,24 ms -     0,25 ms |    223 (  2,23%)
 |+                         |     0,25 ms -     0,27 ms |    268 (  2,68%)
 |                          |     0,27 ms -     0,28 ms |    173 (  1,73%)
 |                          |     0,28 ms -     0,29 ms |    116 (  1,16%)
 |                          |     0,29 ms -     0,30 ms |    143 (  1,43%)
-----------------------------------------------------------------
 |+                         |     0,30 ms -     1,03 ms |    524 (  5,24%)
-----------------------------------------------------------------

10 threads - 10000 requests (by 1000)
Histogram data:
        elements: 10000
        min: 0,103438 ms, max: 7,951487 ms
        max x steps: 25, density per x step: 400,000000
        dx: 100000
-----------------------------------------------------------------
 |                          |     0,10 ms -     0,10 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |++++                      |     0,10 ms -     0,20 ms |   1682 ( 16,82%)
 |++++++++++                |     0,20 ms -     0,30 ms |   4196 ( 41,96%)
 |+++++                     |     0,30 ms -     0,40 ms |   1884 ( 18,84%)
 |+++                       |     0,40 ms -     0,50 ms |   1042 ( 10,42%)
 |+                         |     0,50 ms -     0,60 ms |    285 (  2,85%)
 |+                         |     0,60 ms -     0,70 ms |    269 (  2,69%)
 |+                         |     0,70 ms -     0,80 ms |    255 (  2,55%)
 |                          |     0,80 ms -     0,90 ms |    108 (  1,08%)
 |                          |     0,90 ms -     1,00 ms |     83 (  0,83%)
-----------------------------------------------------------------
 |                          |     1,00 ms -     8,00 ms |    196 (  1,96%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 10000
        min: 0,103438 ms, max: 7,951487 ms
        max x steps: 25, density per x step: 400,000000
        dx: 25000
-----------------------------------------------------------------
 |                          |     0,10 ms -     0,10 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |                          |     0,10 ms -     0,13 ms |     23 (  0,23%)
 |+                         |     0,13 ms -     0,15 ms |    224 (  2,24%)
 |++                        |     0,15 ms -     0,18 ms |    643 (  6,43%)
 |++                        |     0,18 ms -     0,20 ms |    792 (  7,92%)
 |+++                       |     0,20 ms -     0,23 ms |   1208 ( 12,08%)
 |+++                       |     0,23 ms -     0,25 ms |   1199 ( 11,99%)
 |+++                       |     0,25 ms -     0,28 ms |   1032 ( 10,32%)
 |++                        |     0,28 ms -     0,30 ms |    757 (  7,57%)
 |+                         |     0,30 ms -     0,33 ms |    522 (  5,22%)
 |+                         |     0,33 ms -     0,35 ms |    484 (  4,84%)
 |+                         |     0,35 ms -     0,38 ms |    438 (  4,38%)
 |+                         |     0,38 ms -     0,40 ms |    440 (  4,40%)
 |+                         |     0,40 ms -     0,43 ms |    336 (  3,36%)
 |+                         |     0,43 ms -     0,45 ms |    299 (  2,99%)
 |+                         |     0,45 ms -     0,48 ms |    245 (  2,45%)
 |                          |     0,48 ms -     0,50 ms |    162 (  1,62%)
-----------------------------------------------------------------
 |+++                       |     0,50 ms -     7,95 ms |   1196 ( 11,96%)
-----------------------------------------------------------------

50 threads 50000 requests (by 1000)
Histogram data:
        elements: 50000
        min: 0,094517 ms, max: 379,023834 ms
        max x steps: 25, density per x step: 2000,000000
        dx: 100000
-----------------------------------------------------------------
 |                          |     0,09 ms -     0,09 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |++++                      |     0,09 ms -     0,19 ms |   8512 ( 17,02%)
 |+++++++++                 |     0,19 ms -     0,29 ms |  18728 ( 37,46%)
 |+++++                     |     0,29 ms -     0,39 ms |  10993 ( 21,99%)
 |+++                       |     0,39 ms -     0,49 ms |   6434 ( 12,87%)
 |+                         |     0,49 ms -     0,59 ms |   1695 (  3,39%)
 |                          |     0,59 ms -     0,69 ms |    898 (  1,80%)
 |                          |     0,69 ms -     0,79 ms |    593 (  1,19%)
 |                          |     0,79 ms -     0,89 ms |    323 (  0,65%)
 |                          |     0,89 ms -     0,99 ms |    189 (  0,38%)
 |                          |     0,99 ms -     1,09 ms |    168 (  0,34%)
-----------------------------------------------------------------
 |+                         |     1,09 ms -   379,09 ms |   1467 (  2,93%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 50000
        min: 0,094517 ms, max: 379,023834 ms
        max x steps: 25, density per x step: 2000,000000
        dx: 50000
-----------------------------------------------------------------
 |                          |     0,09 ms -     0,09 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+                         |     0,09 ms -     0,14 ms |   1525 (  3,05%)
 |+++                       |     0,14 ms -     0,19 ms |   6987 ( 13,97%)
 |+++++                     |     0,19 ms -     0,24 ms |   9874 ( 19,75%)
 |++++                      |     0,24 ms -     0,29 ms |   8854 ( 17,71%)
 |+++                       |     0,29 ms -     0,34 ms |   6024 ( 12,05%)
 |++                        |     0,34 ms -     0,39 ms |   4969 (  9,94%)
 |++                        |     0,39 ms -     0,44 ms |   4139 (  8,28%)
 |+                         |     0,44 ms -     0,49 ms |   2295 (  4,59%)
 |+                         |     0,49 ms -     0,54 ms |   1092 (  2,18%)
 |                          |     0,54 ms -     0,59 ms |    603 (  1,21%)
 |                          |     0,59 ms -     0,64 ms |    458 (  0,92%)
 |                          |     0,64 ms -     0,69 ms |    440 (  0,88%)
 |                          |     0,69 ms -     0,74 ms |    335 (  0,67%)
-----------------------------------------------------------------
 |+                         |     0,74 ms -   379,04 ms |   2405 (  4,81%)
-----------------------------------------------------------------



100 threads 10000 requests (100)
Histogram data:
        elements: 10000
        min: 0,102470 ms, max: 108,289052 ms
        max x steps: 25, density per x step: 400,000000
        dx: 100000
-----------------------------------------------------------------
 |                          |     0,10 ms -     0,10 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+++++++++                 |     0,10 ms -     0,20 ms |   3400 ( 34,00%)
 |+++++++++                 |     0,20 ms -     0,30 ms |   3405 ( 34,05%)
 |++++                      |     0,30 ms -     0,40 ms |   1666 ( 16,66%)
 |++                        |     0,40 ms -     0,50 ms |    620 (  6,20%)
 |+                         |     0,50 ms -     0,60 ms |    235 (  2,35%)
 |                          |     0,60 ms -     0,70 ms |    157 (  1,57%)
 |                          |     0,70 ms -     0,80 ms |     88 (  0,88%)
 |                          |     0,80 ms -     0,90 ms |     51 (  0,51%)
 |                          |     0,90 ms -     1,00 ms |     36 (  0,36%)
 |                          |     1,00 ms -     1,10 ms |     35 (  0,35%)
 |                          |     1,10 ms -     1,20 ms |     17 (  0,17%)
 |                          |     1,20 ms -     1,30 ms |     15 (  0,15%)
 |                          |     1,30 ms -     1,40 ms |     18 (  0,18%)
 |                          |     1,40 ms -     1,50 ms |     10 (  0,10%)
 |                          |     1,50 ms -     1,60 ms |      7 (  0,07%)
 |                          |     1,60 ms -     1,70 ms |      8 (  0,08%)
 |                          |     1,70 ms -     1,80 ms |      9 (  0,09%)
 |                          |     1,80 ms -     1,90 ms |      6 (  0,06%)
 |                          |     1,90 ms -     2,00 ms |      6 (  0,06%)
 |                          |     2,00 ms -     2,10 ms |      5 (  0,05%)
-----------------------------------------------------------------
 |+                         |     2,10 ms -   108,30 ms |    206 (  2,06%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 10000
        min: 0,102470 ms, max: 108,289052 ms
        max x steps: 25, density per x step: 400,000000
        dx: 25000
-----------------------------------------------------------------
 |                          |     0,10 ms -     0,10 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |                          |     0,10 ms -     0,13 ms |     85 (  0,85%)
 |+                         |     0,13 ms -     0,15 ms |    540 (  5,40%)
 |++                        |     0,15 ms -     0,18 ms |    911 (  9,11%)
 |+++++                     |     0,18 ms -     0,20 ms |   1864 ( 18,64%)
 |+++                       |     0,20 ms -     0,23 ms |   1255 ( 12,55%)
 |++                        |     0,23 ms -     0,25 ms |    866 (  8,66%)
 |++                        |     0,25 ms -     0,28 ms |    687 (  6,87%)
 |+                         |     0,28 ms -     0,30 ms |    597 (  5,97%)
 |+                         |     0,30 ms -     0,33 ms |    524 (  5,24%)
 |+                         |     0,33 ms -     0,35 ms |    455 (  4,55%)
 |+                         |     0,35 ms -     0,38 ms |    375 (  3,75%)
 |+                         |     0,38 ms -     0,40 ms |    312 (  3,12%)
 |+                         |     0,40 ms -     0,43 ms |    243 (  2,43%)
 |                          |     0,43 ms -     0,45 ms |    159 (  1,59%)
 |                          |     0,45 ms -     0,48 ms |    129 (  1,29%)
 |                          |     0,48 ms -     0,50 ms |     89 (  0,89%)
-----------------------------------------------------------------
 |++                        |     0,50 ms -   108,30 ms |    909 (  9,09%)
-----------------------------------------------------------------

threads 500 50000 requests (by 100)
Histogram data:
        elements: 50000
        min: 0,098075 ms, max: 244,454622 ms
        max x steps: 25, density per x step: 2000,000000
        dx: 100000
-----------------------------------------------------------------
 |                          |     0,10 ms -     0,10 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+++++++                   |     0,10 ms -     0,20 ms |  14658 ( 29,32%)
 |+++++++++                 |     0,20 ms -     0,30 ms |  18663 ( 37,33%)
 |+++++                     |     0,30 ms -     0,40 ms |   9067 ( 18,13%)
 |++                        |     0,40 ms -     0,50 ms |   4080 (  8,16%)
 |+                         |     0,50 ms -     0,60 ms |   1215 (  2,43%)
 |                          |     0,60 ms -     0,70 ms |    546 (  1,09%)
 |                          |     0,70 ms -     0,80 ms |    367 (  0,73%)
 |                          |     0,80 ms -     0,90 ms |    174 (  0,35%)
 |                          |     0,90 ms -     1,00 ms |    129 (  0,26%)
 |                          |     1,00 ms -     1,10 ms |     90 (  0,18%)
 |                          |     1,10 ms -     1,20 ms |    101 (  0,20%)
-----------------------------------------------------------------
 |                          |     1,20 ms -   244,50 ms |    910 (  1,82%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 50000
        min: 0,098075 ms, max: 244,454622 ms
        max x steps: 25, density per x step: 2000,000000
        dx: 50000
-----------------------------------------------------------------
 |                          |     0,10 ms -     0,10 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+                         |     0,10 ms -     0,15 ms |   2566 (  5,13%)
 |++++++                    |     0,15 ms -     0,20 ms |  12092 ( 24,18%)
 |++++++                    |     0,20 ms -     0,25 ms |  11932 ( 23,86%)
 |+++                       |     0,25 ms -     0,30 ms |   6731 ( 13,46%)
 |+++                       |     0,30 ms -     0,35 ms |   5135 ( 10,27%)
 |++                        |     0,35 ms -     0,40 ms |   3932 (  7,86%)
 |+                         |     0,40 ms -     0,45 ms |   2771 (  5,54%)
 |+                         |     0,45 ms -     0,50 ms |   1309 (  2,62%)
 |                          |     0,50 ms -     0,55 ms |    730 (  1,46%)
-----------------------------------------------------------------
 |+                         |     0,55 ms -   244,50 ms |   2802 (  5,60%)
-----------------------------------------------------------------



Redis
1 thread - 10000 requests
Histogram data:
        elements: 10000
        min: 0,142482 ms, max: 16,454733 ms
        max x steps: 25, density per x step: 400,000000
        dx: 1000000
-----------------------------------------------------------------
 |                          |     0,14 ms -     0,14 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+++++++++++++++++++++++++ |     0,14 ms -     1,14 ms |   9998 ( 99,98%)
 |                          |     1,14 ms -     2,14 ms |      0 (  0,00%)
 |                          |     2,14 ms -     3,14 ms |      1 (  0,01%)
 |                          |     3,14 ms -     4,14 ms |      0 (  0,00%)
 |                          |     4,14 ms -     5,14 ms |      0 (  0,00%)
 |                          |     5,14 ms -     6,14 ms |      0 (  0,00%)
 |                          |     6,14 ms -     7,14 ms |      0 (  0,00%)
 |                          |     7,14 ms -     8,14 ms |      0 (  0,00%)
 |                          |     8,14 ms -     9,14 ms |      0 (  0,00%)
 |                          |     9,14 ms -    10,14 ms |      0 (  0,00%)
 |                          |    10,14 ms -    11,14 ms |      0 (  0,00%)
 |                          |    11,14 ms -    12,14 ms |      0 (  0,00%)
 |                          |    12,14 ms -    13,14 ms |      0 (  0,00%)
 |                          |    13,14 ms -    14,14 ms |      0 (  0,00%)
 |                          |    14,14 ms -    15,14 ms |      0 (  0,00%)
 |                          |    15,14 ms -    16,14 ms |      0 (  0,00%)
 |                          |    16,14 ms -    17,14 ms |      1 (  0,01%)
-----------------------------------------------------------------
 |                          |    17,14 ms -    17,14 ms |      0 (  0,00%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 10000
        min: 0,142482 ms, max: 16,454733 ms
        max x steps: 25, density per x step: 400,000000
        dx: 2500
-----------------------------------------------------------------
 |+                         |     0,14 ms -     0,19 ms |    203 (  2,03%)
-----------------------------------------------------------------
 |++                        |     0,19 ms -     0,19 ms |    725 (  7,25%)
 |++++                      |     0,19 ms -     0,19 ms |   1474 ( 14,74%)
 |++                        |     0,19 ms -     0,19 ms |    769 (  7,69%)
 |++                        |     0,19 ms -     0,20 ms |    799 (  7,99%)
 |++++                      |     0,20 ms -     0,20 ms |   1477 ( 14,77%)
 |+++                       |     0,20 ms -     0,20 ms |   1038 ( 10,38%)
 |+                         |     0,20 ms -     0,20 ms |    530 (  5,30%)
 |+++                       |     0,20 ms -     0,21 ms |   1194 ( 11,94%)
 |+++                       |     0,21 ms -     0,21 ms |   1262 ( 12,62%)
 |+                         |     0,21 ms -     0,21 ms |    314 (  3,14%)
-----------------------------------------------------------------
 |+                         |     0,21 ms -    16,45 ms |    215 (  2,15%)
-----------------------------------------------------------------

10 threads - 10000 requests (by 1000)
Histogram data:
        elements: 10000
        min: 0,133164 ms, max: 6,673282 ms
        max x steps: 25, density per x step: 400,000000
        dx: 50000
-----------------------------------------------------------------
 |                          |     0,13 ms -     0,13 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+                         |     0,13 ms -     0,18 ms |    357 (  3,57%)
 |++                        |     0,18 ms -     0,23 ms |    963 (  9,63%)
 |++++                      |     0,23 ms -     0,28 ms |   1785 ( 17,85%)
 |++++++                    |     0,28 ms -     0,33 ms |   2423 ( 24,23%)
 |+++                       |     0,33 ms -     0,38 ms |   1132 ( 11,32%)
 |+++                       |     0,38 ms -     0,43 ms |   1247 ( 12,47%)
 |++                        |     0,43 ms -     0,48 ms |    826 (  8,26%)
 |+                         |     0,48 ms -     0,53 ms |    248 (  2,48%)
 |                          |     0,53 ms -     0,58 ms |    159 (  1,59%)
 |                          |     0,58 ms -     0,63 ms |    107 (  1,07%)
-----------------------------------------------------------------
 |++                        |     0,63 ms -     6,68 ms |    753 (  7,53%)
-----------------------------------------------------------------

50 threads - 10000 requests (by 200)
Histogram data:
        elements: 10000
        min: 0,119990 ms, max: 47,799053 ms
        max x steps: 25, density per x step: 400,000000
        dx: 5000000
-----------------------------------------------------------------
 |                          |     0,12 ms -     0,12 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |++++++++++++++++++++++++  |     0,12 ms -     5,12 ms |   9436 ( 94,36%)
 |                          |     5,12 ms -    10,12 ms |    102 (  1,02%)
 |                          |    10,12 ms -    15,12 ms |     53 (  0,53%)
 |                          |    15,12 ms -    20,12 ms |    143 (  1,43%)
 |                          |    20,12 ms -    25,12 ms |    157 (  1,57%)
 |                          |    25,12 ms -    30,12 ms |     44 (  0,44%)
 |                          |    30,12 ms -    35,12 ms |     47 (  0,47%)
 |                          |    35,12 ms -    40,12 ms |      5 (  0,05%)
 |                          |    40,12 ms -    45,12 ms |     10 (  0,10%)
 |                          |    45,12 ms -    50,12 ms |      3 (  0,03%)
-----------------------------------------------------------------
 |                          |    50,12 ms -    50,12 ms |      0 (  0,00%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 10000
        min: 0,119990 ms, max: 47,799053 ms
        max x steps: 25, density per x step: 400,000000
        dx: 50000
-----------------------------------------------------------------
 |+                         |     0,12 ms -     0,17 ms |    490 (  4,90%)
-----------------------------------------------------------------
 |++                        |     0,17 ms -     0,22 ms |    940 (  9,40%)
 |+++                       |     0,22 ms -     0,27 ms |   1153 ( 11,53%)
 |++++                      |     0,27 ms -     0,32 ms |   1585 ( 15,85%)
 |+++                       |     0,32 ms -     0,37 ms |   1229 ( 12,29%)
 |+++                       |     0,37 ms -     0,42 ms |   1191 ( 11,91%)
 |++                        |     0,42 ms -     0,47 ms |    916 (  9,16%)
 |+                         |     0,47 ms -     0,52 ms |    494 (  4,94%)
 |+                         |     0,52 ms -     0,57 ms |    235 (  2,35%)
 |                          |     0,57 ms -     0,62 ms |    171 (  1,71%)
 |                          |     0,62 ms -     0,67 ms |    135 (  1,35%)
 |                          |     0,67 ms -     0,72 ms |    112 (  1,12%)
 |                          |     0,72 ms -     0,77 ms |    130 (  1,30%)
-----------------------------------------------------------------
 |+++                       |     0,77 ms -    47,82 ms |   1219 ( 12,19%)
-----------------------------------------------------------------

100 threads - 10000 requests (by 100)
Histogram data:
        elements: 10000
        min: 0,125251 ms, max: 71,117095 ms
        max x steps: 25, density per x step: 400,000000
        dx: 5000000
-----------------------------------------------------------------
 |                          |     0,13 ms -     0,13 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |++++++++++++++++++++++++  |     0,13 ms -     5,13 ms |   9624 ( 96,24%)
 |                          |     5,13 ms -    10,13 ms |     13 (  0,13%)
 |                          |    10,13 ms -    15,13 ms |      2 (  0,02%)
 |                          |    15,13 ms -    20,13 ms |     16 (  0,16%)
 |                          |    20,13 ms -    25,13 ms |     22 (  0,22%)
 |                          |    25,13 ms -    30,13 ms |     35 (  0,35%)
 |                          |    30,13 ms -    35,13 ms |     22 (  0,22%)
 |                          |    35,13 ms -    40,13 ms |     13 (  0,13%)
 |                          |    40,13 ms -    45,13 ms |     56 (  0,56%)
 |                          |    45,13 ms -    50,13 ms |     64 (  0,64%)
 |                          |    50,13 ms -    55,13 ms |     25 (  0,25%)
 |                          |    55,13 ms -    60,13 ms |     41 (  0,41%)
 |                          |    60,13 ms -    65,13 ms |     51 (  0,51%)
 |                          |    65,13 ms -    70,13 ms |     14 (  0,14%)
 |                          |    70,13 ms -    75,13 ms |      2 (  0,02%)
-----------------------------------------------------------------
 |                          |    75,13 ms -    75,13 ms |      0 (  0,00%)
-----------------------------------------------------------------
расшифровка диапаозна
Histogram data:
        elements: 10000
        min: 0,125251 ms, max: 71,117095 ms
        max x steps: 25, density per x step: 400,000000
        dx: 50000
-----------------------------------------------------------------
 |+                         |     0,13 ms -     0,18 ms |    583 (  5,83%)
-----------------------------------------------------------------
 |+++                       |     0,18 ms -     0,23 ms |   1129 ( 11,29%)
 |+++                       |     0,23 ms -     0,28 ms |   1368 ( 13,68%)
 |++++                      |     0,28 ms -     0,33 ms |   1723 ( 17,23%)
 |+++                       |     0,33 ms -     0,38 ms |   1180 ( 11,80%)
 |+++                       |     0,38 ms -     0,43 ms |   1135 ( 11,35%)
 |++                        |     0,43 ms -     0,48 ms |    797 (  7,97%)
 |+                         |     0,48 ms -     0,53 ms |    406 (  4,06%)
 |+                         |     0,53 ms -     0,58 ms |    201 (  2,01%)
 |                          |     0,58 ms -     0,63 ms |    127 (  1,27%)
 |                          |     0,63 ms -     0,68 ms |    114 (  1,14%)
 |                          |     0,68 ms -     0,73 ms |    120 (  1,20%)
 |                          |     0,73 ms -     0,78 ms |    133 (  1,33%)
 |                          |     0,78 ms -     0,83 ms |    105 (  1,05%)
-----------------------------------------------------------------
 |++                        |     0,83 ms -    71,13 ms |    879 (  8,79%)
-----------------------------------------------------------------


500 threads - 50000 requests (by 100)
Histogram data:
        elements: 50000
        min: 0,117327 ms, max: 413,838795 ms
        max x steps: 25, density per x step: 2000,000000
        dx: 10000000
-----------------------------------------------------------------
 |                          |     0,12 ms -     0,12 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |++++++++++++++++++++++++  |     0,12 ms -    10,12 ms |  47432 ( 94,86%)
 |                          |    10,12 ms -    20,12 ms |     28 (  0,06%)
 |                          |    20,12 ms -    30,12 ms |     37 (  0,07%)
 |                          |    30,12 ms -    40,12 ms |     15 (  0,03%)
 |                          |    40,12 ms -    50,12 ms |      9 (  0,02%)
 |                          |    50,12 ms -    60,12 ms |     23 (  0,05%)
 |                          |    60,12 ms -    70,12 ms |     41 (  0,08%)
 |                          |    70,12 ms -    80,12 ms |     73 (  0,15%)
 |                          |    80,12 ms -    90,12 ms |     41 (  0,08%)
 |                          |    90,12 ms -   100,12 ms |     23 (  0,05%)
 |                          |   100,12 ms -   110,12 ms |     53 (  0,11%)
 |                          |   110,12 ms -   120,12 ms |    147 (  0,29%)
 |                          |   120,12 ms -   130,12 ms |     88 (  0,18%)
 |                          |   130,12 ms -   140,12 ms |    115 (  0,23%)
 |                          |   140,12 ms -   150,12 ms |     62 (  0,12%)
 |                          |   150,12 ms -   160,12 ms |     37 (  0,07%)
 |                          |   160,12 ms -   170,12 ms |    160 (  0,32%)
 |                          |   170,12 ms -   180,12 ms |     97 (  0,19%)
 |                          |   180,12 ms -   190,12 ms |    113 (  0,23%)
 |                          |   190,12 ms -   200,12 ms |     55 (  0,11%)
-----------------------------------------------------------------
 |+                         |   200,12 ms -   420,12 ms |   1351 (  2,70%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 50000
        min: 0,117327 ms, max: 413,838795 ms
        max x steps: 25, density per x step: 2000,000000
        dx: 50000
-----------------------------------------------------------------
 |+                         |     0,12 ms -     0,17 ms |   2508 (  5,02%)
-----------------------------------------------------------------
 |+++                       |     0,17 ms -     0,22 ms |   5669 ( 11,34%)
 |+++                       |     0,22 ms -     0,27 ms |   6008 ( 12,02%)
 |++++                      |     0,27 ms -     0,32 ms |   7732 ( 15,46%)
 |+++                       |     0,32 ms -     0,37 ms |   5873 ( 11,75%)
 |+++                       |     0,37 ms -     0,42 ms |   5756 ( 11,51%)
 |++                        |     0,42 ms -     0,47 ms |   4308 (  8,62%)
 |+                         |     0,47 ms -     0,52 ms |   2299 (  4,60%)
 |+                         |     0,52 ms -     0,57 ms |   1205 (  2,41%)
 |                          |     0,57 ms -     0,62 ms |    859 (  1,72%)
 |                          |     0,62 ms -     0,67 ms |    634 (  1,27%)
 |                          |     0,67 ms -     0,72 ms |    561 (  1,12%)
 |                          |     0,72 ms -     0,77 ms |    575 (  1,15%)
 |                          |     0,77 ms -     0,82 ms |    509 (  1,02%)
 |                          |     0,82 ms -     0,87 ms |    328 (  0,66%)
 |                          |     0,87 ms -     0,92 ms |    217 (  0,43%)
 |                          |     0,92 ms -     0,97 ms |    231 (  0,46%)
 |                          |     0,97 ms -     1,02 ms |    199 (  0,40%)
-----------------------------------------------------------------
 |++                        |     1,02 ms -   413,87 ms |   4529 (  9,06%)
-----------------------------------------------------------------



ADDITIONAL TESTS!!!
500 threads - 50000 requests - BUT Jredis Service count increased to 100!
Histogram data:
        elements: 50000
        min: 0,125896 ms, max: 94,820788 ms
        max x steps: 25, density per x step: 2000,000000
        dx: 100000
-----------------------------------------------------------------
 |                          |     0,13 ms -     0,13 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |++++                      |     0,13 ms -     0,23 ms |   7455 ( 14,91%)
 |++++++++                  |     0,23 ms -     0,33 ms |  15776 ( 31,55%)
 |++++++                    |     0,33 ms -     0,43 ms |  12704 ( 25,41%)
 |+++                       |     0,43 ms -     0,53 ms |   5908 ( 11,82%)
 |+                         |     0,53 ms -     0,63 ms |   1982 (  3,96%)
 |+                         |     0,63 ms -     0,73 ms |   1384 (  2,77%)
 |+                         |     0,73 ms -     0,83 ms |   1112 (  2,22%)
 |                          |     0,83 ms -     0,93 ms |    531 (  1,06%)
 |                          |     0,93 ms -     1,03 ms |    383 (  0,77%)
 |                          |     1,03 ms -     1,13 ms |    299 (  0,60%)
 |                          |     1,13 ms -     1,23 ms |    405 (  0,81%)
 |                          |     1,23 ms -     1,33 ms |    205 (  0,41%)
 |                          |     1,33 ms -     1,43 ms |    155 (  0,31%)
 |                          |     1,43 ms -     1,53 ms |    125 (  0,25%)
 |                          |     1,53 ms -     1,63 ms |    143 (  0,29%)
 |                          |     1,63 ms -     1,73 ms |     77 (  0,15%)
 |                          |     1,73 ms -     1,83 ms |     80 (  0,16%)
 |                          |     1,83 ms -     1,93 ms |     70 (  0,14%)
 |                          |     1,93 ms -     2,03 ms |     94 (  0,19%)
-----------------------------------------------------------------
 |+                         |     2,03 ms -    94,83 ms |   1112 (  2,22%)
-----------------------------------------------------------------



Hazelcast
1 thread - 10000 requests
Histogram data:
        elements: 10000
        min: 0,215282 ms, max: 101,412167 ms
        max x steps: 25, density per x step: 400,000000
        dx: 10000
-----------------------------------------------------------------
 |+                         |     0,22 ms -     0,34 ms |    149 (  1,49%)
-----------------------------------------------------------------
 |+                         |     0,34 ms -     0,35 ms |    103 (  1,03%)
 |+                         |     0,35 ms -     0,36 ms |    148 (  1,48%)
 |+                         |     0,36 ms -     0,37 ms |    170 (  1,70%)
 |++                        |     0,37 ms -     0,38 ms |    430 (  4,30%)
 |++++                      |     0,38 ms -     0,39 ms |   1489 ( 14,89%)
 |+++                       |     0,39 ms -     0,40 ms |   1009 ( 10,09%)
 |+++++++++                 |     0,40 ms -     0,41 ms |   3264 ( 32,64%)
 |+++                       |     0,41 ms -     0,42 ms |   1157 ( 11,57%)
 |+++                       |     0,42 ms -     0,43 ms |   1131 ( 11,31%)
 |+                         |     0,43 ms -     0,44 ms |    243 (  2,43%)
 |+                         |     0,44 ms -     0,45 ms |    169 (  1,69%)
 |+                         |     0,45 ms -     0,46 ms |    148 (  1,48%)
 |+                         |     0,46 ms -     0,47 ms |    108 (  1,08%)
-----------------------------------------------------------------
 |+                         |     0,47 ms -   101,42 ms |    282 (  2,82%)
-----------------------------------------------------------------

10 threads - 10000 requests (by 1000 in thread)
Histogram data:
        elements: 10000
        min: 0,220889 ms, max: 101,739531 ms
        max x steps: 25, density per x step: 400,000000
        dx: 100000
-----------------------------------------------------------------
 |                          |     0,22 ms -     0,22 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+                         |     0,22 ms -     0,32 ms |    368 (  3,68%)
 |++++++++++                |     0,32 ms -     0,42 ms |   3770 ( 37,70%)
 |++++++                    |     0,42 ms -     0,52 ms |   2169 ( 21,69%)
 |++++                      |     0,52 ms -     0,62 ms |   1320 ( 13,20%)
 |++                        |     0,62 ms -     0,72 ms |    542 (  5,42%)
 |+                         |     0,72 ms -     0,82 ms |    374 (  3,74%)
 |+                         |     0,82 ms -     0,92 ms |    187 (  1,87%)
 |+                         |     0,92 ms -     1,02 ms |    166 (  1,66%)
 |+                         |     1,02 ms -     1,12 ms |     99 (  0,99%)
 |+                         |     1,12 ms -     1,22 ms |    100 (  1,00%)
 |+                         |     1,22 ms -     1,32 ms |     68 (  0,68%)
 |+                         |     1,32 ms -     1,42 ms |     69 (  0,69%)
 |+                         |     1,42 ms -     1,52 ms |     46 (  0,46%)
 |+                         |     1,52 ms -     1,62 ms |     56 (  0,56%)
 |+                         |     1,62 ms -     1,72 ms |     37 (  0,37%)
 |+                         |     1,72 ms -     1,82 ms |     34 (  0,34%)
 |+                         |     1,82 ms -     1,92 ms |     38 (  0,38%)
 |+                         |     1,92 ms -     2,02 ms |     27 (  0,27%)
 |+                         |     2,02 ms -     2,12 ms |     27 (  0,27%)
 |+                         |     2,12 ms -     2,22 ms |     23 (  0,23%)
 |+                         |     2,22 ms -     2,32 ms |     21 (  0,21%)
 |+                         |     2,32 ms -     2,42 ms |     25 (  0,25%)
 |+                         |     2,42 ms -     2,52 ms |     12 (  0,12%)
 |+                         |     2,52 ms -     2,62 ms |     16 (  0,16%)
 |+                         |     2,62 ms -     2,72 ms |     14 (  0,14%)
-----------------------------------------------------------------
 |+                         |     2,72 ms -   101,82 ms |    392 (  3,92%)
-----------------------------------------------------------------


50 threads - 10000 requests (by 200)
Histogram data:
        elements: 10000
        min: 0,220611 ms, max: 100,343166 ms
        max x steps: 25, density per x step: 400,000000
        dx: 5000000
-----------------------------------------------------------------
 |                          |     0,22 ms -     0,22 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+++++++++++++++++++++++++ |     0,22 ms -     5,22 ms |   9675 ( 96,75%)
 |+                         |     5,22 ms -    10,22 ms |    167 (  1,67%)
 |+                         |    10,22 ms -    15,22 ms |     96 (  0,96%)
 |+                         |    15,22 ms -    20,22 ms |     35 (  0,35%)
 |+                         |    20,22 ms -    25,22 ms |     10 (  0,10%)
 |+                         |    25,22 ms -    30,22 ms |      7 (  0,07%)
 |+                         |    30,22 ms -    35,22 ms |      2 (  0,02%)
 |+                         |    35,22 ms -    40,22 ms |      6 (  0,06%)
 |+                         |    40,22 ms -    45,22 ms |      1 (  0,01%)
 |                          |    45,22 ms -    50,22 ms |      0 (  0,00%)
 |                          |    50,22 ms -    55,22 ms |      0 (  0,00%)
 |                          |    55,22 ms -    60,22 ms |      0 (  0,00%)
 |                          |    60,22 ms -    65,22 ms |      0 (  0,00%)
 |                          |    65,22 ms -    70,22 ms |      0 (  0,00%)
 |                          |    70,22 ms -    75,22 ms |      0 (  0,00%)
 |                          |    75,22 ms -    80,22 ms |      0 (  0,00%)
 |                          |    80,22 ms -    85,22 ms |      0 (  0,00%)
 |                          |    85,22 ms -    90,22 ms |      0 (  0,00%)
 |                          |    90,22 ms -    95,22 ms |      0 (  0,00%)
 |                          |    95,22 ms -   100,22 ms |      0 (  0,00%)
 |+                         |   100,22 ms -   105,22 ms |      1 (  0,01%)
-----------------------------------------------------------------
 |                          |   105,22 ms -   105,22 ms |      0 (  0,00%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 10000
        min: 0,220611 ms, max: 100,343166 ms
        max x steps: 25, density per x step: 400,000000
        dx: 50000
-----------------------------------------------------------------
 |                          |     0,22 ms -     0,22 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+                         |     0,22 ms -     0,27 ms |    142 (  1,42%)
 |+                         |     0,27 ms -     0,32 ms |    386 (  3,86%)
 |++++                      |     0,32 ms -     0,37 ms |   1295 ( 12,95%)
 |+++++++                   |     0,37 ms -     0,42 ms |   2516 ( 25,16%)
 |++++                      |     0,42 ms -     0,47 ms |   1261 ( 12,61%)
 |++                        |     0,47 ms -     0,52 ms |    762 (  7,62%)
 |++                        |     0,52 ms -     0,57 ms |    627 (  6,27%)
 |++                        |     0,57 ms -     0,62 ms |    517 (  5,17%)
 |+                         |     0,62 ms -     0,67 ms |    296 (  2,96%)
 |+                         |     0,67 ms -     0,72 ms |    219 (  2,19%)
 |+                         |     0,72 ms -     0,77 ms |    192 (  1,92%)
 |+                         |     0,77 ms -     0,82 ms |    171 (  1,71%)
-----------------------------------------------------------------
 |+++++                     |     0,82 ms -   100,37 ms |   1616 ( 16,16%)
-----------------------------------------------------------------


100 threads - 10000 requests (by 100)
Histogram data:
        elements: 10000
        min: 0,222737 ms, max: 42,075268 ms
        max x steps: 25, density per x step: 400,000000
        dx: 5000000
-----------------------------------------------------------------
 |                          |     0,22 ms -     0,22 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+++++++++++++++++++++++++ |     0,22 ms -     5,22 ms |   9648 ( 96,48%)
 |+                         |     5,22 ms -    10,22 ms |    164 (  1,64%)
 |+                         |    10,22 ms -    15,22 ms |    110 (  1,10%)
 |+                         |    15,22 ms -    20,22 ms |     44 (  0,44%)
 |+                         |    20,22 ms -    25,22 ms |     13 (  0,13%)
 |+                         |    25,22 ms -    30,22 ms |      5 (  0,05%)
 |+                         |    30,22 ms -    35,22 ms |      4 (  0,04%)
 |+                         |    35,22 ms -    40,22 ms |      3 (  0,03%)
 |+                         |    40,22 ms -    45,22 ms |      9 (  0,09%)
-----------------------------------------------------------------
 |                          |    45,22 ms -    45,22 ms |      0 (  0,00%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 10000
        min: 0,222737 ms, max: 42,075268 ms
        max x steps: 25, density per x step: 400,000000
        dx: 100000
-----------------------------------------------------------------
 |                          |     0,22 ms -     0,22 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |++                        |     0,22 ms -     0,32 ms |    452 (  4,52%)
 |++++++++++                |     0,32 ms -     0,42 ms |   3719 ( 37,19%)
 |++++++                    |     0,42 ms -     0,52 ms |   2091 ( 20,91%)
 |+++                       |     0,52 ms -     0,62 ms |   1139 ( 11,39%)
 |++                        |     0,62 ms -     0,72 ms |    561 (  5,61%)
 |+                         |     0,72 ms -     0,82 ms |    353 (  3,53%)
 |+                         |     0,82 ms -     0,92 ms |    226 (  2,26%)
 |+                         |     0,92 ms -     1,02 ms |    167 (  1,67%)
-----------------------------------------------------------------
 |++++                      |     1,02 ms -    42,12 ms |   1292 ( 12,92%)
-----------------------------------------------------------------


500 threads - 50000 requests (by 100)
Histogram data:
        elements: 50000
        min: 0,207696 ms, max: 151,666026 ms
        max x steps: 25, density per x step: 2000,000000
        dx: 10000000
-----------------------------------------------------------------
 |                          |     0,21 ms -     0,21 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+++++++++++++++++++++++++ |     0,21 ms -    10,21 ms |  49021 ( 98,04%)
 |+                         |    10,21 ms -    20,21 ms |    795 (  1,59%)
 |+                         |    20,21 ms -    30,21 ms |    120 (  0,24%)
 |+                         |    30,21 ms -    40,21 ms |     42 (  0,08%)
 |+                         |    40,21 ms -    50,21 ms |     20 (  0,04%)
 |+                         |    50,21 ms -    60,21 ms |      1 (  0,00%)
 |                          |    60,21 ms -    70,21 ms |      0 (  0,00%)
 |                          |    70,21 ms -    80,21 ms |      0 (  0,00%)
 |                          |    80,21 ms -    90,21 ms |      0 (  0,00%)
 |                          |    90,21 ms -   100,21 ms |      0 (  0,00%)
 |                          |   100,21 ms -   110,21 ms |      0 (  0,00%)
 |                          |   110,21 ms -   120,21 ms |      0 (  0,00%)
 |                          |   120,21 ms -   130,21 ms |      0 (  0,00%)
 |                          |   130,21 ms -   140,21 ms |      0 (  0,00%)
 |                          |   140,21 ms -   150,21 ms |      0 (  0,00%)
 |+                         |   150,21 ms -   160,21 ms |      1 (  0,00%)
-----------------------------------------------------------------
 |                          |   160,21 ms -   160,21 ms |      0 (  0,00%)
-----------------------------------------------------------------
расшифровка диапазона
Histogram data:
        elements: 50000
        min: 0,207696 ms, max: 151,666026 ms
        max x steps: 25, density per x step: 2000,000000
        dx: 100000
-----------------------------------------------------------------
 |                          |     0,21 ms -     0,21 ms |      0 (  0,00%)
-----------------------------------------------------------------
 |+                         |     0,21 ms -     0,31 ms |   1371 (  2,74%)
 |+++++++++                 |     0,31 ms -     0,41 ms |  16113 ( 32,23%)
 |+++++++                   |     0,41 ms -     0,51 ms |  12499 ( 25,00%)
 |++++                      |     0,51 ms -     0,61 ms |   6322 ( 12,64%)
 |++                        |     0,61 ms -     0,71 ms |   3167 (  6,33%)
 |++                        |     0,71 ms -     0,81 ms |   2007 (  4,01%)
 |+                         |     0,81 ms -     0,91 ms |   1205 (  2,41%)
 |+                         |     0,91 ms -     1,01 ms |    873 (  1,75%)
-----------------------------------------------------------------
 |++++                      |     1,01 ms -   151,71 ms |   6443 ( 12,89%)
-----------------------------------------------------------------

пятница, июня 25, 2010

Быстрая установка и запуск memcached, redis в CentOS 5.5

Выбираем быстрый внешний кеш для веб-проекта на java. Смотрим как явовские решения, так и нативные. Обратили внимание на Hazelcast, Redis, Memcached. Краткая инструкция по установке в 4 шага.

Установка redis в CentOS 5.5
1) wget http://redis.googlecode.com/files/redis-1.2.6.tar.gz
2) tar xvzf redis-1.2.6.tar.gz
3) cd redis-1.02
4) make
5) ./redis-server

Установка memcached в CentOS 5.5
1) rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
2) rpm -Uvh http://rpms.famillecollet.com/el5.i386/remi-release-5-8.el5.remi.noarch.rpm
3) yum --enablerepo=remi install memcached
4) service memcached start

На всякий.

среда, июня 23, 2010

Композиция тайлсов в Apache Tiles 2

При использовании Apache Tiles 2 в одном веб-проекте на Spring MVC в качестве view layer встал как-то вопрос о создании компоновок внутри компоновок. То есть имеется простой глобальный лайаут: заголовок, контент, футер. Нужно в контент поместить еще одну компоновку со своим хедером, контентом и футером и в конкретных реализациях страниц менять только этот вложенный контент. Стандартно в тайлсах только в template могут быть включения других тайлсов, во всех других случаях это не пройдет. В этом случае поможет следующий подход:
1) декларируется еще одна компоновка, в которую включаются частями все возможные варианты для страниц с пустыми значениями атрибутов
2) для каждой страницы указывается реализация конкретной страницы именно для нужного атрибута

Какой минус? Главный наверно в том, что на каждую страницу нужно иметь по атрибуту во вложенной компоновке и такое же количество дополнительных деклараций в xml.

Чтобы было более понятно попробуем порисовать

   Template             Page1
|-------------|    |-------------|
|GlobalHeader |    |GlobalHeader |
|-------------|    |-------------|
|GlobalContent| <- |InnerHeader  |\
|-------------|    |InnerContent | - это будет innertemplate
|GlobalFooter |    |InnerFooter  |/
|-------------|    |-------------|
                   |GlobalFooter |
                   |-------------|

 
  
  
  
 

   
  
  
  
  
     
 

   
  
 

 
 
 



Собственно innertemplate, page1content это и есть "лишний груз", но без него никак. Такую же мысль можно прочитать в статье http://resources.mdbitz.com/2009/10/nested-tiles-an-apache-tiles-quick-guide-to-nesting-tiles/

пятница, июня 18, 2010

Amarok и cp1251

Тема как оказывается стара и избита. Часто попадаются mp3 с тегами в win-1251. Самое правильное решение - перегнать в Unicode. Тем более что id3v2 это предполагает. id3v2.3 - utf16 а в id3v2.4 utf8.
Как-то так:
find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1

четверг, июня 17, 2010

Fedora Core, Wine, MS Office

Пару дней назад поставил дома linux, конкретно Fedora 13, еще более конкретно - Russian Fedora. Хороший десктопный дистрибутив, близок к серверному CentOS. Мне, как закаленному виндузятнику, Федора вполне понравилась. Проблемы были только с видеокартой - пару раз слетали дрова nvidia, помогло описание установки родных дров. Все остальное определилось и нашлось нормально, включая принтер и имеющиеся ntfsные партиции.
После установки Федоры стал искать замену всего двум вещам - Total Commander и Notepad++, потому что все остальное, из того что нужно мне, есть и под линукс. И, к сожалению, никаких приемлемых решений аналогичных по функционалу и простоте пользования в линуксе не нашел, поэтому установил их в Wine. Что удивительно - отлично работают! Но больше всего на меня произвела впечатление установка .NET в составе winetricks к Wine. MS Office установленный по мануалу заработал как часы, включая печать на принтере.
Теперь что не понравилось:
- субъективно KDE тормознее, чем GUI Windows 7. Это очень плохо, надо разобраться только ли в GUI дело
- KDE иногда не перерисовывает области, где были контролы
- в KDE мне совершенно не понравились курсоры, заменил их на aerodrop
- по умолчанию нельзя создавать на десктопе иконки самому, приходится шаманить
- Не таскаются иконки из десктопа в панель - только через меню или файловый навигатор

Как видно пока не нравится только некоторые минусы KDE, при большом количестве плюсов. Так что поживем - увидим.

От openjdk, поставляемого с Федорой я не в восторге. Mavenовский плагин maven-jetty-plugin c openjdk вообще выдавал
EXCEPTION java.lang.ClassCastException: gnu.java.nio.ServerSocketChannelImpl cannot be cast to java.nio.channels.SocketChannel. Так что пришлось ставить sun java. Более ли менее вменяемо установка sun java поясняется здесь.
Далее IDE.Сама установка Eclipse проблем не вызвала, потому что ее в общем то нет, а вот что делать с SELinux показано здесь

UPD: поскольку ссылки умирают, чтобы не было проблем с Eclipse и SELinux при запуске и не выдавалось сообщение "failed to load the jni shared library /opt/jdk1.6.0_20/bin/../jre/lib/i386/client/libjvm.so" не забываем править контекст безопасности для jvm командой
chcon -t textrel_shlib_t /opt/jdk1.6.0_20/jre/lib/i386/client/libjvm.so

Apache Tiles 2, isError="true"

Исходные данные: Spring MVC, Tiles, JSP. Нужно сделать страницу с ошибкой "ресурс не найден", чтобы без редиректа на страницу ошибки, и чтобы не только текст с использованием шаблона сайта, но и соответствующей http ошибкой. Страница эта, естественно, наследуется от общего шаблона, например

<definition name="base" template="/WEB-INF/layouts/base.jsp">
    <put-attribute name="content" value="" type="string" />
</definition>
<definition name="notfound" extends="base" >
    <put-attribute name="content" value="/WEB-INF/views/notfound.jsp"type="template" />
</definition>

Казалось бы, вроде обычный jsp, поэтому мог бы прокатить скриптлет прямо в /WEB-INF/views/notfound.jsp:

<%response.setStatus(response.SC_NOT_FOUND); %>


Ан нет. HttpServletResponse уже сформирован, setStatus в пролете.
Вариант <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true" %> тоже не пройдет - получите эксепшен.

В Spring я перекладываю эту работу на контроллер. Как-то так:
@RequestMapping(value="/qwe/{asd}",method=RequestMethod.GET)
 public ModelAndView getQwe(@PathVariable("asd") String asd,
   HttpServletResponse response) throws Exception { 
  ModelAndView mod=new ModelAndView("notfound");
  response.setStatus(response.SC_NOT_FOUND);
  return mod; 
}

вторник, июня 15, 2010

2048 процов на стойку!

Поздравляю вас, господа, это стало стоить всего 140000$. Уверен, что максимум через 5 лет это будет стоить 40 000 $. Кажется, уже пора массово переходить на конкурентные параллельные базовые структуры и алгоритмы. Некоторые из тех, кто инженерят компы с 800 процессорами и информационные системы под такое железо, уже сделали свой вклад.

Ссылки:
http://gigaom.com/2010/06/13/seamicros-low-power-server-finally-launches/
http://lenta.ru/news/2010/06/14/atom/

четверг, июня 10, 2010

Кнопка поиска как на youtube.com

Мне нравится минималистический дизайн в приложениях. Эталоном веб-приложений в категории минимализма дизайна я считаю youtube.com. Все по делу и к месту. Особенно симпатичны кнопки, в частности "Поиска". На первый взгляд все просто http://stackoverflow.com/questions/2564084/how-do-i-get-the-same-buttons-as-youtube. Но в FireFox есть особенность - на button показывается точечная граница. Как с этим бороться показано в Remove Button Focus Outline Using CSS
http://www.karlrixon.co.uk/articles/css/remove-button-focus-outline-using-css/

В итоге вот как выглядят разметка и стили кнопки Поиск на youtube.com
.yt-uix-button{
  padding:0 .5em;
  height:2.0833em;
  border:1px solid #ccc;
  background:#f6f6f6;
  background-image:-moz-linear-gradient(top,#ffffff,#efefef);
  background-image:-webkit-gradient(linear,left top,left bottom,from(#ffffff),to(#efefef));
  filter:progid:DXImageTransform.Microsoft.Gradient(startColorStr=#ffffff,endColorStr=#efefef);
  -ms-filter:"progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFFFFF,endColorStr=#EFEFEF)";
  -moz-border-radius:3px;
  -webkit-border-radius:3px;
  border-radius:3px;
  white-space:nowrap;
  vertical-align:middle;
  cursor:pointer; 
  overflow:visible;
}

.yt-uix-button-content{
  line-height:1.6666em;
  display:inline-block;
  vertical-align:middle
}

.yt-uix-button:hover,.yt-uix-button:focus {
  border-color:#999;
  background:#f3f3f3;
  background-image:-moz-linear-gradient(top,#ffffff,#ebebeb);
  background-image:-webkit-gradient(linear,left top,left bottom,from(#ffffff),to(#ebebeb));
  filter:progid:DXImageTransform.Microsoft.Gradient(startColorStr=#ffffff,endColorStr=#ebebeb);
  -ms-filter:"progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFFFFF,endColorStr=#EBEBEB)";
  outline:0;
  -moz-box-shadow:0 0 3px #999;
  -webkit-box-shadow:0 0 3px #999;
  box-shadow:0 0 3px #999
}

.yt-uix-button:active {
  border-color:#999;
  background:#ddd;
  background-image:-moz-linear-gradient(top,#cccccc,#ffffff);
  background-image:-webkit-gradient(linear,left top,left bottom,from(#cccccc),to(#ffffff));
  filter:progid:DXImageTransform.Microsoft.Gradient(startColorStr=#cccccc,endColorStr=#ffffff);
  -ms-filter:"progid:DXImageTransform.Microsoft.Gradient(startColorStr=#CCCCCC,endColorStr=#FFFFFF)"
}

.yt-uix-button img{
  vertical-align:middle;
  font-size:0
}

.yt-uix-button::-moz-focus-inner{
  border:0;
}

В разметке:

<button class="yt-uix-button" type="button">
   <span class="yt-uix-button-content">Search</span>
</button>

Ключевая строка, чтобы убрать точечную границу это .yt-uix-button::-moz-focus-inner{border:0;}

До этого для подобных кнопок использовал решение с http://stopdesign.com/eg/buttons/3.1/code.html. Но там неприятная особенность - в Хроме немного обрезается нижний правый угол у button, притом что с anchor все в порядке.

Есть еще классный проект по созданию кнопок http://css-tricks.com/examples/ButtonMaker

И напоследок отличный набор CSS-инструментов в статье 50 New Useful CSS Techniques, Tools and Tutorials http://www.smashingmagazine.com/2010/06/10/50-new-useful-css-techniques-tools-and-tutorials/

четверг, июня 03, 2010

Формула Apache Cassandra: Map<String,Map<String,String>>

Кажется, что все технологии символичны. Все они созданы для преодоления реальных или виртуальных проблем. Кажется, что каждой из них можно поставить в равенство или приблизительное равенство более понятный, лучше воспринимаемый символ. Иногда этот символ являет собой код. Вообще кодами да утраченными символами в мировом масштабе увлекается Дэн Браун, но сейчас не о нем. Сейчас об Apache Cassandra.
Я сформулировал символ, формулу и код этого проекта. Вот он: Map<String,Map<String,String>>
Кратко, символично, в коде.

Мой список блогов