Свежие комментарии

Title Comment
No luck:

No luck:
# sysctl net.inet.tcp | grep space
net.inet.tcp.sendspace: 1048576
net.inet.tcp.recvspace: 1048576
(на обоих концах, конечно)

# dd if=/dev/zero bs=1M count=10000 | ssh -c aes128-gcm@openssh.com 10.5.0.4 dd of=/dev/null bs=1M
10000+0 records in
10000+0 records out
10485760000 bytes transferred in 33.001974 secs (317731297 bytes/sec)

lexa@home-gw:/home/lexa# dd if=/dev/zero bs=1M count=10000 | rsh 10.5.0.4 dd of=/dev/null bs=1M
10000+0 records in
10000+0 records out
10485760000 bytes transferred in 34.201657 secs (306586318 bytes/sec)

Читать tcpdump (гигабайтный) на предмет что там с tcp options происходит и отчего - уже не хочется.

> если на принимающей стороне

> если на принимающей стороне увеличить bs у dd, результат не меняется

Зато будет виднее, кто жрёт CPU, а кто нет.

> Может быть тупо большой tcp buffer и не скейлить его.

mbuffer, судя по его сорцам, по умолчанию ставит размер приёмного буфера в 1 мегабайт (TCP RWIN), а rsh использует системный дефолт:

$ sysctl net.inet.tcp | fgrep recv
net.inet.tcp.recvspace: 65536
net.inet.tcp.recvbuf_max: 2097152
net.inet.tcp.recvbuf_inc: 16384
net.inet.tcp.recvbuf_auto: 1

Вероятно, автоскейлинг тупо не успевает разогнать. Можно попробовать либо поднять первоначальное значение net.inet.tcp.recvspace сразу до мегабайта, либо резко увеличить инкремент net.inet.tcp.recvbuf_inc

вдогонку: судя по 98%

вдогонку: судя по 98% interrupt при тестах с mbuffer, этот 1.1 гигабайт/сек - близко к пределу, но тем не менее - могет.

Я что хочу сказать

Я что хочу сказать
1) когда я фигачу ssh (360Mb/sec)/rsh (до 330) - я вижу ~40k прерываний в секунду. Типа, много.
если на принимающей стороне увеличить bs у dd, результат не меняется
2) Дальше беру mbuffer:
Sender:
dd if=/dev/zero bs=1M count=50000 | mbuffer -4 -O 10.5.0.3:3333 -s 64k -m 64m
in @ 1180 MiB/s, out @ 1180 MiB/s, 48.3 GiB total, buffer 100% full50000+0 records in
50000+0 records out
52428800000 bytes transferred in 42.463043 secs (1234692477 bytes/sec)

Receiver:
mbuffer -4 -I 3333 -s 64k -m 64m -o /dev/null
in @ 1180 MiB/s, out @ 1180 MiB/s, 48.3 GiB total, buffer 0% full
summary: 48.8 GiByte in 42.5sec - average of 1176 MiB/s

Прерываний 75-85k в секунду.

Теперь уж netcat, раз его все советуют:
dd if=/dev/zero bs=1M count=50000 | nc 10.5.0.3 3333
50000+0 records in
50000+0 records out
52428800000 bytes transferred in 82.591318 secs (634797954 bytes/sec)

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) вместе со всем шифрованием:
# dd if=/dev/zero bs=1M count=5000 | ssh -c aes128-gcm@openssh.com 10.5.0.3 dd of=/dev/null
5000+0 records in
5000+0 records out
5242880000 bytes transferred in 15.304234 secs (342577094 bytes/sec)
10240000+0 records in
10240000+0 records out
5242880000 bytes transferred in 14.986247 secs (349846106 bytes/sec)

У меня узкое место - на

У меня узкое место - на принимающей стороне.

Вот типичная картина (скриншоты проще получаются в png, пардон)
top на sender: https://www.dropbox.com/s/3issenlt4x833ah/top-rsh-send.png?dl=0
top на receiver: https://www.dropbox.com/s/1r6fva7876mekxf/top-rsh-recv.png?dl=0

На sender делаю так:
# dd if=/dev/zero bs=1M count=10000 | rsh 10.5.0.3 dd of=/dev/null
10000+0 records in
10000+0 records out
10485760000 bytes transferred in 33.885600 secs (309445904 bytes/sec)
20475234+8465 records in
20480000+0 records out
10485760000 bytes transferred in 33.756500 secs (310629359 bytes/sec)

надо определить узкое место

Там как раз и об узких местах.

Конечно, не только в dd.

Конечно, не только в dd. Узкое место наверняка CPU, а dd bs=1G только усугубляет проблему, создавая немалый дополнительный вклад в загрузку CPU драйвером /dev/zero, что никак не помогает вычленить основную неоптимизированную подсистему, чтобы её оптимизировать :-)

Ну вот как бы сказать: dd bs

Ну вот как бы сказать: dd bs=1G | mbuffer | network | mbuffer | devnull - 8гигабит
а dd bs=1G | rsh | network | mbuffer | devnull - 2.5

Сдается мне, дело тут не (только) в 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.

Тут такая история

Тут такая история
1) ssh (и с шифрованием и без) работает быстрее rsh
2) mbuffer - mbuffer выжирает нормально почти всю полосу, ну там не 10 гигабит а 8, мне достаточно.

Проблема в том, что мне нужен именно 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
Лучше исключить ssh из цепочки пересылки данных, даже с выключенным шифрованием.
Замена mbuffer на nc (netcat) на обеих концах может ощутимо поднять скорость. Были прецеденты.

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.

Я поразмыслил, вопрос

Я поразмыслил, вопрос непростой
1) Ну действительно, если префетч справился - значит это место (в этот раз) прочлось быстро и хрен ли его кэшировать
2) а если нет - то кэшируем.

Это выглядит разумным поведением на первый взгляд.

А на второй - работает случайность/вероятность и для моих конкретных тестовых наборов - ну вот почти 100% читаемого линейно большого датасета оказывается в L2 с 5..8 прохода.

Лично мне бы конечно тут нужен бы тюнинг (per dataset)
- писать в L2 все (даже то, что считалось префетчем). Это типа "для рабочих файлов". Ну вот когда я с фоточками работаю - я просмотрю набор сильно больше одного раза.
- не писать в L2 - это уже есть (secondarycache = metadata)
- не писать то, что успешно читалось префетчем, независимо от того, успело или не успело (см. выше).

Впрочем, конечно, раз прочитать 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 - ну наверное потому что только часть блоков попала и действительно чтения с магнитных блинов все тормозят.

Извинте за форматирование, ща

Извинте за форматирование, ща все исправлю

Pages

Subscribe to comments_recent_new