Свежие комментарии
Title | Comment |
---|---|
No luck: |
No luck: # dd if=/dev/zero bs=1M count=10000 | ssh -c aes128-gcm@openssh.com 10.5.0.4 dd of=/dev/null bs=1M lexa@home-gw:/home/lexa# dd if=/dev/zero bs=1M count=10000 | rsh 10.5.0.4 dd of=/dev/null bs=1M Читать tcpdump (гигабайтный) на предмет что там с tcp options происходит и отчего - уже не хочется. |
> если на принимающей стороне |
> если на принимающей стороне увеличить bs у dd, результат не меняется Зато будет виднее, кто жрёт CPU, а кто нет. > Может быть тупо большой tcp buffer и не скейлить его. mbuffer, судя по его сорцам, по умолчанию ставит размер приёмного буфера в 1 мегабайт (TCP RWIN), а rsh использует системный дефолт: $ sysctl net.inet.tcp | fgrep recv Вероятно, автоскейлинг тупо не успевает разогнать. Можно попробовать либо поднять первоначальное значение net.inet.tcp.recvspace сразу до мегабайта, либо резко увеличить инкремент net.inet.tcp.recvbuf_inc |
вдогонку: судя по 98% |
вдогонку: судя по 98% interrupt при тестах с mbuffer, этот 1.1 гигабайт/сек - близко к пределу, но тем не менее - могет. |
Я что хочу сказать |
Я что хочу сказать Receiver: Прерываний 75-85k в секунду. Теперь уж netcat, раз его все советуют: mbuffer быстрее. Из чего я делаю вывод, что дело не в настройках собственно сетевого интерфейса ix (сетевая карта на sender Intel X540, на принимающей Ethernet Connection X553/X557-AT 10GBASE-T, обе 10G). Возможно interrupt moderation помог бы немного, но для 9k-пакетов там количество пакетов на самом деле не очень большое. Дело, как я думаю, в настройках tcp. Что-то такое mbuffer умеет, чего ssh/rsh не умеют. Может быть тупо большой tcp buffer и не скейлить его. |
> У меня узкое место - на |
> У меня узкое место - на принимающей стороне. Да, так оно обычно и бывает. На принимающей стороне, судя по https://www.dropbox.com/s/1r6fva7876mekxf/top-rsh-recv.png?dl=0 многовато прерываний и просто безобразное время system time, которое объясняется не заданным bs у принимающего dd, от чего он использует дефолтный bs=512 и насилует ядро безумным количеством сисколлов write() - лучше всё же задать bs=1m. Что касается прерываний на принимающей стороне - не вижу скриншотов systam и я не уловил, какие там сетевые интерфейсы? Если Intel, то максимизировано ли количество приёмных дескрипторов чипа и настроена ли группировка прерываний (interrupt coalescing) под бОльшую нагрузку? Я не пробовал тюнить десятигигабитные интелевские интерфейсы, а насчет гигабитных можно почитать тут: https://dadv.livejournal.com/139170.html |
Это на принимающей стороне |
Это на принимающей стороне HPN, на передающей - обычный, сейчас попробую HPN patches применить еще. |
При этом ssh стабильно |
При этом ssh стабильно быстрее (процентов на 10) вместе со всем шифрованием: |
У меня узкое место - на |
У меня узкое место - на принимающей стороне. Вот типичная картина (скриншоты проще получаются в png, пардон) На sender делаю так: |
надо определить узкое место |
Там как раз и об узких местах. |
Конечно, не только в dd. |
Конечно, не только в dd. Узкое место наверняка CPU, а dd bs=1G только усугубляет проблему, создавая немалый дополнительный вклад в загрузку CPU драйвером /dev/zero, что никак не помогает вычленить основную неоптимизированную подсистему, чтобы её оптимизировать :-) |
Ну вот как бы сказать: dd bs |
Ну вот как бы сказать: dd bs=1G | mbuffer | network | mbuffer | devnull - 8гигабит Сдается мне, дело тут не (только) в dd. |
Прежде чем начинать тюнить - |
Прежде чем начинать тюнить - надо определить узкое место. И раз rsh тоже тормозит (а это голый TCP-сокет), то узкое место наверняка не (только) в ssh. |
что бы такое потюнить |
http://www.allanjude.com/bsd/AsiaBSDCon2017_-_SSH_Performance.pdf |
Скорость тут достаточная, |
Скорость тут достаточная, потому что не приходится параллельно тратить CPU на обслуживание сетевых прерываний и CPU хватает. А когда сеть тоже хочет CPU - картина будет другая. |
(по частям буду отвечать) Да, |
(по частям буду отвечать) Да, bs=1G - идея не очень, ну то есть 1M - быстрее раза в два. Тем не менее "скорость - достаточная" # dd if=/dev/zero bs=1G count=100 of=/dev/null 100+0 records in 100+0 records out 107374182400 bytes transferred in 5.003121 secs (21461438177 bytes/sec) lexa@home-gw:~# dd if=/dev/zero bs=1M count=100000 of=/dev/null 100000+0 records in 100000+0 records out 104857600000 bytes transferred in 2.521523 secs (41585024741 bytes/sec) 20 и 40 GB/sec в таком раскладе. mbuffer понятно тоже жрет от души и с ним (| mbuffer -o /dev/null) получается 2.5 и 5, но и в этом случае это все на порядок больше той скорости, что мы имеем с rsh/ssh (а dd bs=1G| mbuffer | network | mbuffer - ну 8Gbit дают, в отличие от 2.5 через *sh). Пошел пускать топы и systat. |
Тут такая история |
Тут такая история Проблема в том, что мне нужен именно remote shell, чтобы ошибки с удаленного конца ловить. То есть конечно, если rsh починить не получится, придется mbuffer - mbuffer или netcat, но не хотелось бы |
Во-первых, dd if=/dev/zero bs |
Во-первых, dd if=/dev/zero bs=1G это плохая идея (читать крупными кусками из /dev/zero под FreeBSD). Во-вторых (и убедиться в первых) - надо запускать top -SHPI в процессе на обоих системах и глядеть, где узкое место. Ещё полезно в процессе запускать systat -vm 3 и глядеть в правый столбец на количество прерываний. |
> что бы такое потюнить (у |
> что бы такое потюнить (у ssh, openssh-portable, rsh |
rsh счастья не принес: https: |
rsh счастья не принес: https://blog.lexa.ru/2018/11/24/q_freebsd_freebsd_remote_shell_speed.html |
вопрос непростой |
Тоже были такие мысли :-). Можно выключить префетч, быстро полностью затарить нужные файлы в L2ARC, а затем включить префетч. Думал даже сделать это автоматом при загрузке. Где-то год назад в одном месте стояла подобная задача и нужно было сделать - "что бы летало". Поэтому пришлось вникнуть, что бы заставить "работать как надо". В результате после первого чтения имел скорость nvme (около 1,7GB/s). Затем, после того как заметил, что метаданные сжимаются где-то в 25 раз, сообразил, что в данной схеме можно ещё настроить и жёсткую пирамиду - самые востребованные данные читаются только из ARC, менее востребованные из L2ARC, остальные из основного пула. Отстроил и это. И ... упёрся в латентность сети :-). Оказалось проще и эффективней для той задачи переместить нужные для работы каталоги на локальный nvme. |
Я поразмыслил, вопрос |
Я поразмыслил, вопрос непростой Это выглядит разумным поведением на первый взгляд. А на второй - работает случайность/вероятность и для моих конкретных тестовых наборов - ну вот почти 100% читаемого линейно большого датасета оказывается в L2 с 5..8 прохода. Лично мне бы конечно тут нужен бы тюнинг (per dataset) Впрочем, конечно, раз прочитать 4-5 раз годится - то я просто рабочие файлы могу потарить в devnull перед началом работы и усе. |
вы бы порепортили в FreeBSD |
"Тотальное" кеширование противоречит заявленной "The main role of this cache is to boost the performance of random read workloads." И сам механизм сканирования хвоста арка для такого "тотального" кеширования не очень подходит. Для хорошего эффекта нужно рассчитывать время, глубину сканирования, учитывать производительность основного пула и ssd. Наверно это не для универсального продукта. Только для специфических задач. |
«Вообще, вы бы порепортили в |
«Вообще, вы бы порепортили в FreeBSD, раз уж в это место влезли и разобрались?» Вот да. (у меня L2ARC нету, я снял, у меня хитрейт был 2.5%, а SSD понадобился, к тому же это был SATA SSD и он не сильно быстрее массива). |
если сделать prefetch disable |
если сделать prefetch disable, то все очень медленно. Вообще, вы бы порепортили в FreeBSD, раз уж в это место влезли и разобрались? |
Забыл сказать это точно было |
Забыл сказать это точно было в 11.1. 11.2 ещё не пробовал. |
И на 8-й раз оно туда улеглось примено целиком |
Если сделать vfs.zfs.prefetch_disable=1 и подобрать параметры сканирования/записи в L2ARC, то данные могут закешироваться даже после первого-второго чтения, причем в последующем чтение с hdd будет полностью отсутствовать. Что бы была понятна причина - в одной из ветвей после предварительного чтения и последующего результативного чтения в созданной структуре для арка не устанавливается ARC_FLAG_L2CACHE и при сканировании данная запись не может попасть в L2ARC. Попадание в это ответвление зависит - было ли на момент результативного чтения предварительное чтение завершено или нет. |
И на 8-й раз оно туда |
И на 8-й раз оно туда улеглось примено целиком # zpool iostat -v zdata 5 | grep diskid/DISK-C6EF076A07E100005289 diskid/DISK-C6EF076A07E100005289 111G 336G 2 1 2,65M 1,75M diskid/DISK-C6EF076A07E100005289 111G 336G 715 0 684M 1020K diskid/DISK-C6EF076A07E100005289 111G 336G 1,09K 47 1,08G 47,0M diskid/DISK-C6EF076A07E100005289 111G 336G 1,18K 12 1,18G 12,2M diskid/DISK-C6EF076A07E100005289 111G 336G 1,16K 11 1,16G 11,2M diskid/DISK-C6EF076A07E100005289 111G 336G 1,24K 0 1,24G 0 diskid/DISK-C6EF076A07E100005289 111G 336G 717 1 711M 2,00M Первая строчка - общая статистика, вторая и последняя - не все время из 5 сек. измерения было чтение, а вот 1+ гиг в секунду - это сколько SSD-шка умеет как раз, больше не умеет. |
Прочитал эти же файлы еще два |
Прочитал эти же файлы еще два раза (всего, значит, четыре). Размер набора файлов - 50G, в L2 легло 46G (до начала - было занято 60, сейчас 106). Читаем в пятый раз: # zpool iostat -v zdata 5 | grep diskid/DISK-C6EF076A07E100005289 diskid/DISK-C6EF076A07E100005289 106G 341G 1 1 1,26M 1,68M diskid/DISK-C6EF076A07E100005289 106G 341G 180 0 156M 204K diskid/DISK-C6EF076A07E100005289 106G 341G 802 6 793M 6,76M diskid/DISK-C6EF076A07E100005289 106G 341G 1,07K 49 1,06G 49,1M diskid/DISK-C6EF076A07E100005289 107G 340G 802 74 799M 74,5M diskid/DISK-C6EF076A07E100005289 107G 340G 557 32 555M 32,5M diskid/DISK-C6EF076A07E100005289 107G 340G 691 13 689M 13,6M diskid/DISK-C6EF076A07E100005289 107G 340G 895 38 892M 38,1M diskid/DISK-C6EF076A07E100005289 108G 339G 20 214 19,1M 214M diskid/DISK-C6EF076A07E100005289 108G 339G 0 8 0 8,57M О чем я, собственно, и говорю: L2 набирается, но сильно постепенно, вот за пять чтений набора файлов (путем tar cvf /dev/null .) где-то процентов 90 куда надо легло. |
Вот почему оно читает только |
Вот почему оно читает только 250Mb/sec - ну наверное потому что только часть блоков попала и действительно чтения с магнитных блинов все тормозят. |
Извинте за форматирование, ща |
Извинте за форматирование, ща все исправлю |