
我目前正在做一個高中項目,透過研究 RSA 金鑰來更好地從理論和實踐上理解它們。專案的一部分是一個實驗,我選擇測試一下,看看產生不同長度的RSA金鑰時CPU的工作量有多大。如果我需要得出結論,我還想節省時間作為數據點。
電腦運行的是 Ubuntu 16.04,應用程式是從預設的儲存庫下載。
計劃是使用 GnuPG 產生不同長度(1024、2048 和 4096)的 RSA 金鑰,並使用 GNU Time 來取得 CPU 的工作負載和執行該過程的時間。該過程將使用 python 腳本自動化,如下所示:
對於 [1024, 2048, 4096] 中的長度:
1.1. X 次:
1.1.1.執行Gnu PG指令並監控系統資源
1.1.2.將系統資源的使用寫入文件
此後我將繪製一些圖表來看看我的假設是否正確。
但我對 GnuPG 測試的實作有一些疑問。在問題之後解釋我的實施將如何進行。我的問題是:
- 這個設定能達到我想要的效果嗎?
- 我可以透過某種方式停用吊銷憑證的自動建立嗎?
- 為什麼產生一些密鑰需要更長的時間?
- 為什麼 GnuPG 給出的答案是在用戶空間中創建密鑰花了 0 CPU 秒?是在另一個進程中完成的嗎?
- 為什麼當建立金鑰的時間少於一秒鐘(掛鐘 > 1)時,CPU 工作負載參數僅顯示值(0 < CPU)?
閱讀手冊似乎產生密鑰的最簡單方法是--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]
我在 shell 中執行的命令(如果很重要,則使用 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 何時運行到“低熵”模式。
在目前的硬體平台上,被 IO 阻塞或睡眠的進程將被置於後台,因此不會計算 CPU 時間。
$ 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%
最後,這也解釋了為什麼快速迭代會帶來更高的 CPU 工作負載:由於進程在 IO-wait 中阻塞的時間更短,因此實際計算時間佔完整執行時間的比例要大得多。