
В настоящее время я работаю над школьным проектом, изучая ключи RSA для лучшего понимания их теоретически и практически. Часть проекта состоит из эксперимента, и я решил провести тестирование и посмотреть, насколько большой будет нагрузка на ЦП при генерации ключей RSA разной длины. Я также хотел бы сохранить время в качестве точки данных, если мне нужно будет прийти к выводу.
На компьютере установлена ОС Ubuntu 16.04, а приложения загружаются из репозиториев по умолчанию.
План состоит в том, чтобы использовать GnuPG для генерации ключей RSA разной длины (1024, 2048 и 4096) и GNU Time для получения рабочей нагрузки процессора и времени выполнения процесса. Процесс будет автоматизирован с помощью скрипта на Python и будет выглядеть примерно так:
Для длины в [1024, 2048, 4096]:
1.1. Для X раз:
1.1.1. Выполнение команды Gnu PG и мониторинг системных ресурсов
1.1.2 Запись использования системных ресурсов в файл
После этого я построю несколько графиков, чтобы проверить, верна ли моя гипотеза.
Но у меня есть несколько вопросов по реализации моего теста GnuPG. Объяснение того, как я это реализую, будет после вопросов. Мои вопросы:
- Делают ли эти настройки то, что мне нужно?
- Можно ли как-то отключить автоматическое создание сертификатов отзыва?
- Почему генерация некоторых ключей занимает гораздо больше времени?
- Почему GnuPG выдает ответ, что создание ключей заняло 0 CPU-секунд в пользовательском пространстве? Это делается в другом процессе?
- Почему параметр нагрузки ЦП показывает только значение (0 < ЦП), когда на создание ключей ушло меньше секунды (часы > 1)?
Читая руководство, кажется, что самый простой способ генерации ключей — --batch
включить эту опцию. Я задал опции в файле со следующими инструкциями:
# Text syntax in this file
#%dry-run
%echo Generating RSA key...
# Don't ask after passphrase
%no-protection
Key-type: RSA
Key-Length: 1024
Name-Real: Real Name
Name-Email: [email protected]
Expire-Date: 0
# Generate RSA key
%commit
%echo Done!
Команда, которая выполняет этот файл, состоит из двух частей: Gnu Time и GnuPG. Команда GNU Time выглядит следующим образом:
$ time --format="Wall clock: %e[s], CPU (userspace): %U[s], CPU (workload): %P%"
А команда GnuPG следующая.
$ gpg2 --gen-key --homedir=./rsa-keys --batch [filename]
Команда, которую я выполняю в своей оболочке (fish shell, если это важно), выглядит следующим образом (GNU Time + GnuPG):
$ time --format="Wall clock: %e[s], CPU (userspace): %U[s], CPU (workload): %P%" gpg2 --gen-key --homedir=./rsa-keys --batch [filename]
Вывод команды:
Wall clock: 36.83[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 0.04[s], CPU (userspace): 0.00[s], CPU (workload): 8%
Wall clock: 4.76[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 72.39[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 57.52[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 84.71[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 63.32[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 51.10[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 47.58[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 64.72[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 0.05[s], CPU (userspace): 0.00[s], CPU (workload): 6%
Wall clock: 0.03[s], CPU (userspace): 0.00[s], CPU (workload): 11%
Wall clock: 29.62[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 55.02[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 36.08[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 42.92[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 40.41[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 204.36[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 246.42[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 51.50[s], CPU (userspace): 0.00[s], CPU (workload): 0%
решение1
GnuPG считывает из /dev/random
, который блокируется, когда недостаточно энтропии (что является спорным поведением). Фактические вычислительные усилия довольно незначительны. Вы также можете заметить, что первый запуск/несколько запусков завершаются быстрее, поскольку пул энтропии все еще заполнен "свежими битами". Я рекомендую запустить watch cat /proc/sys/kernel/random/entropy_avail
в дополнительном терминале, чтобы понять, когда GnuPG переходит в режим "низкой энтропии".
На текущих аппаратных платформах процессы, заблокированные вводом-выводом или спящим режимом, будут переведены в фоновый режим, поэтому процессорное время не будет учитываться.
$ time --format='Wall clock: %e[s], CPU (userspace): %U[s], CPU (workload): %P%' sleep 5
Wall clock: 5.00[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Это также видно при копировании некоторых байтов /dev/random
(что может занять довольно много времени, особенно в виртуальных машинах):
time --format='Wall clock: %e[s], CPU (userspace): %U[s], CPU (workload): %P%' dd if=/dev/random of=/dev/null bs=1 count=512
512+0 records in
512+0 records out
512 bytes copied, 210.672 s, 0.0 kB/s
Wall clock: 210.67[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Наконец, это также объясняет, почему быстрые итерации имели гораздо более высокую нагрузку на ЦП: поскольку процессы блокировались в режиме ожидания ввода-вывода в течение гораздо меньшего периода времени, доля фактического времени вычислений в полном времени выполнения была намного больше.