Есть ли способ разделить процесс шифрования/дешифрования на несколько ядер с помощью SFTP?

Есть ли способ разделить процесс шифрования/дешифрования на несколько ядер с помощью SFTP?

Я нахожусь в ситуации, когда процесс шифрования в передаче SFTP максимизирует одно ядро ​​ЦП. Однако моя пропускная способность ввода-вывода (диски, шины и сеть) далека от максимальной.

При этом рассматриваемая система имеет несколько ядер: я хотел бы задействовать их в процессе шифрования/дешифрования.

Возможно ли это? Если да, то как?

Примечание: если это вообще возможно, я бы хотел избегать наборов исправлений с модификациями, которые не считаются достаточно хорошими для включения в основную ветку разработки OpenSSH.

решение1

Нет. Протокол SFTP не оставляет много возможностей для распараллеливания.оригинальный протоколтребует алгоритмов шифрования и MAC, которые не могут быть распараллелены в пакете. OpenSSH поддерживаетГКМ, который можно распараллелить, но OpenSSH не пытается распараллелить внутри пакета. Хотя протокол позволяет распараллеливать обработку последовательных пакетов, OpenSSH этого не делает.

Почему OpenSSH не распараллеливает? Потому что распараллеливание сложно реализовать правильно, и оно полезно для производительности только в определенных сценариях:

  • В большинстве случаев узким местом является сеть, поэтому оптимизация процессорного времени бессмысленна.
  • Если система выполняет другие задачи (включая обслуживание нескольких SSH-подключений параллельно), то параллелизм обработки SSH отрицательно сказывается на производительности других процессов.
  • Распараллеливание имеет свою стоимость: рабочая нагрузка должна быть передана участвующим процессорам, а данные должны быть собраны, когда все процессоры закончат работу. Синхронизация имеет довольно высокую стоимость, поэтому распараллеливание выгодно только в том случае, если каждый рабочий элемент достаточно большой. Для SSH распараллеливание в пакете вряд ли будет выгодным.
  • Распараллеливание обработки нескольких пакетов было бы возможным, но это оказало бы огромное влияние на структуру программного обеспечения: вместо простой потоковой передачи данных потребовался бы сложный интерфейс между уровнем данных и уровнем криптографии.

OpenSSH разработан с учетом безопасности, а сложность — враг безопасности, поэтому было бы совершенно нетипично даже рассматривать параллелизацию. Хотя кто-то другой это сделал:HPN-SSHэто набор патчей для OpenSSH, которые позволяют параллельную обработку. Он все еще поддерживается на сегодняшний день.

ARMv8 представляет аппаратное ускорение для AES, SHA-1 и SHA-256. Если у вас есть плата ARMv8 (независимо от того, используете ли вы 32-битную или 64-битную систему), убедитесь, что ваша криптобиблиотека (OpenSSL для OpenSSH) скомпилирована с ускорением ARMv8. Некоторые до ARMv8 имеют фирменное криптоускорение, которое может бытьраскрывается ядром Linux, но OpenSSL не поддерживает это «из коробки» (существовали исправления ядра и OpenSSL, но они имели историю прекращения поддержки).

Если вы не хотите использовать патчи HPN, то вы можете распараллелить выше уровня SSH. Если у вас много маленьких файлов для передачи, скопируйте их партиями и распараллелите партии. Если у вас большой файл для передачи, скопируйте его кусками и распараллелите куски.

Связанный контент