【快播報(bào)】SGX性能實(shí)驗(yàn)

2023-01-11 15:30:38 來(lái)源:51CTO博客

SGX實(shí)驗(yàn)報(bào)告?

一.實(shí)驗(yàn)?zāi)繕?biāo)?

了解采用SGX可信任環(huán)境后對(duì)應(yīng)用和目標(biāo)主機(jī)產(chǎn)生的性能影響有多少。?


(資料圖片僅供參考)

二.實(shí)驗(yàn)準(zhǔn)備?

Microsoft Window10 21H2版本主機(jī)一臺(tái),?

處理器:Intel Core(TM)i5-9500F ??CPU@3.00GHZ???

64位操作系統(tǒng),內(nèi)存16GB?

代碼編譯環(huán)境:vs2015專業(yè)版或者Clion2021?

SGX插件相關(guān)版本?

Intel ME版本:ME_SW_1909.12.0.1237?

SDK版本:Intel SGX SDK for Windows v2.12.100.4?

PSW版本:Intel SGX PSW for Windows v2.12.100.4?

三.實(shí)驗(yàn)過(guò)程?

3.1 不使用SGX插件運(yùn)行相關(guān)計(jì)算程序?

小程序:計(jì)算一萬(wàn)以內(nèi)的素?cái)?shù),(循環(huán)10000次)?

程序源碼:?

//?// Created by hudengfeng on 2023/1/9.?//?#include ?#include ?using namespace std;?// 計(jì)算10000以內(nèi)的素?cái)?shù)?void calculate_prime(){? int i,j,k=0;//i是2-10000待確認(rèn)是否為素?cái)?shù)的數(shù),j表示i的因子,k表示素?cái)?shù)的個(gè)數(shù)? for(i=2;i<10000;i++){? for(j=2;j*j<=i;j++){? if(i%j==0)//判斷i是否能被1和本身以外的數(shù)整除,%表示求余? break;//break跳出第二個(gè)for循環(huán)? }? if(j*j>i){? cout<//每增加一個(gè)素?cái)?shù)k就加1? if(k%10==0) //一行打印10個(gè)數(shù)之后換行? {? cout<// cout << "hello world!"<? exe();? return 0;?}?

正常情況cpu使用率:20%(均值)?

運(yùn)行程序cpu使用率:70%(均值)?

代碼運(yùn)行結(jié)果(10次)?

11.732s、13.635s、16.017s、12.544s、14.327s?

11.515s、14.301s、12.988s、15.251s、12.677s?

均值:13.499s?

3.2 使用SGX插件運(yùn)行相關(guān)計(jì)算程序?

基本原理:?

SGX程序分為兩部分,一部分是app應(yīng)用,也就是不可信區(qū),一部分是enclave應(yīng)用,也就是可信區(qū),非可信區(qū)只能通過(guò) ECALL 函數(shù)調(diào)用可信區(qū)內(nèi)的函數(shù),可信區(qū)只能通過(guò) OCALL 函數(shù)調(diào)用非可信區(qū)的函數(shù),ECALL 函數(shù)和 OCALL 函數(shù)通過(guò) EDL 文件聲明。?

程序目錄結(jié)構(gòu):?

App 目錄內(nèi)為不可信區(qū)域代碼,包括 main 入口、OCALL 函數(shù)內(nèi)具體邏輯代碼等等。?

Enclave 目錄為可信區(qū)域代碼,包括 ECALL 函數(shù)內(nèi)具體邏輯代碼實(shí)現(xiàn)。?

Enclave.lds:EDL(Enclave Description Language) 文件。?

Enclave_private.pem:enclave.so 的簽名私鑰。?

Enclave.config.xml:Enclave 配置文件,如堆棧大小、是否可等。?

Enclave.h & Enclave.cpp:應(yīng)用安全區(qū)代碼實(shí)現(xiàn)。?

Include目錄是不可信代碼和可信代碼共享的頭文件。?

在app程序中通過(guò)ecall函數(shù)調(diào)用enclave程序的calculate函數(shù)來(lái)計(jì)算結(jié)果,然后把計(jì)算的結(jié)果通過(guò)ocall函數(shù)返回給app程序,然后app程序把結(jié)果打印出來(lái)。?

編譯運(yùn)行:?

1.通過(guò) sgx_edger8r 工具在 App/ 目錄下生成不可信代碼(Enclave_u.c 和 Enclave_u.h),這部分生成代碼主要會(huì)調(diào)用 ECALL (sgx_ecall);?

2.編譯不可信部分 Binary: app;?

3.通過(guò)sgx_edger8r 工具在 Enclave/ 目錄下生成可信代碼(Enclave_t.c 和 Enclave_t.h);?

4.編譯可信動(dòng)態(tài)鏈接庫(kù)(enclave.so);?

5.通過(guò)sgx_sing工具簽名可信動(dòng)態(tài)鏈接庫(kù)(enclave.signed.so);?

6.結(jié)束。?

編譯后的代碼目錄結(jié)構(gòu):?

實(shí)驗(yàn)結(jié)果:?

正常情況cpu使用率:20%(均值)?

運(yùn)行程序cpu使用率:80%(均值)?

代碼運(yùn)行結(jié)果(10次)?

17.496s、12.854s、14.327s、15.635s、14.324s?

12.432s、11.543s、15.398s、18.534s、13.264s?

均值:14.580s?

3.3 enclave安全區(qū)多次切換?

核心程序源碼:?

App.cpp?

#include ?#include ?#include ?#include ?# include ?# include ?# define MAX_PATH FILENAME_MAX?#include "sgx_urts.h"?#include "App.h"?#include "Enclave_u.h"?using namespace std;?/* Global EID shared by multiple threads */?sgx_enclave_id_t global_eid = 0;?int initialize_enclave(void)?{? sgx_status_t ret = SGX_ERROR_UNEXPECTED;? /* 調(diào)用 sgx_create_enclave 創(chuàng)建一個(gè) Enclave 實(shí)例 */? /* Debug Support: set 2nd parameter to 1 */? ret = sgx_create_enclave(ENCLAVE_FILENAME, SGX_DEBUG_FLAG, NULL, NULL, &global_eid, NULL);? if (ret != SGX_SUCCESS) {? printf("Failed to create enclave, ret code: %d\n", ret);? return -1;? }? return 0;?}?/* 應(yīng)用程序入口 */?int SGX_CDECL main(int argc, char *argv[])?{? (void)(argc);? (void)(argv);? clock_t start, finish;? double duration;? start = clock();? /* 創(chuàng)建并初始化 Enclave */? if(initialize_enclave() < 0){? printf("Enter a character before exit ...\n");? getchar();? return -1;? }? /* ECALL 調(diào)用 */? /*計(jì)算10000以內(nèi)的素?cái)?shù)*/? for(inti = 0; i < 10; ++i) {?ecall_calculate_from_enclave(global_eid);?}?finish = clock();? duration = (double)(finish - start) / CLOCKS_PER_SEC;? cout<<"計(jì)算累計(jì)用時(shí):"</* 銷毀 Enclave */? sgx_destroy_enclave(global_eid);? printf("Info: SampleEnclave successfully returned.\n");? printf("Enter a character before exit ...\n");? getchar();? return 0;?}?

Enclave.cpp?

void ecall_calculate_from_enclave(){? for (int j = 0; j < 1000; ++j) {? calculate_prime();? }?}?

由以上App.cpp(51-53行)程序可以看出,還是計(jì)算10000以內(nèi)的素?cái)?shù)(10000次),但是Enclave.cpp當(dāng)中只計(jì)算了1000次。app.cpp當(dāng)中有10次循環(huán)調(diào)用ecall函數(shù)?

實(shí)驗(yàn)結(jié)果:?

正常情況cpu使用率:20%(均值)?

運(yùn)行程序cpu使用率:84%(均值)?

代碼運(yùn)行結(jié)果(10次)?

22.065s、24.905s、25.687s、21.522s、18.417s?

21.592s、20.666s、21.845s、21.499s、18.457s?

均值:21.666s?

3.4 enclave的epc內(nèi)存測(cè)試?

首先修改編譯器設(shè)置,默認(rèn)堆棧區(qū)大小是1M,如果不想使用堆棧,可在全局區(qū)使用大數(shù)組,前面加上static即可。需要在圖形化界面修改堆棧保留大小這個(gè)字段。單位是bit,這里改成256MB,也就是256*1024*1024*8。也可在CMakeLists.txt添加下面2行,就可以達(dá)到修改堆棧內(nèi)存大小的效果。?

MATH(EXPR stack_size "256*1024*1024")單位是字節(jié)?

set(CMAKE_EXE_LINKER_FLAGS "-Wl,--stack,${stack_size}")?

也可通過(guò)圖形化界面修改,在vs2015在項(xiàng)目的屬性,找到鏈接器的系統(tǒng)這一欄,?

3.4.1 不使用enclave單獨(dú)跑帶有大數(shù)組的程序?

在3.4.1執(zhí)行函數(shù)中新增代碼(5-10行)?

void exe(){? clock_t start, finish;? double duration;? start = clock();? int a[4096][4096] = {0};? int b[4096][4096] = {1};? a[0][0] = 1;? size_t num = sizeof(a);? a[0][1] = num;? b[0][0] = a[0][1];? for (int j = 0; j < 10000; ++j) {? calculate_prime();? }? finish = clock();? duration = (double)(finish - start) / CLOCKS_PER_SEC;? cout<申請(qǐng)了一個(gè)兩個(gè)4096*4096的int類型大數(shù)組,初始化值為0,一個(gè)大數(shù)組內(nèi)存應(yīng)該是4*4*4=96MB,兩個(gè)是192MB,超過(guò)了128MB,然后開始跑程序。?

實(shí)驗(yàn)結(jié)果:?

正常情況cpu使用率:20%(均值)?

運(yùn)行代碼程序后cpu使用率:84%(均值)?

代碼運(yùn)行結(jié)果(10次)?

17.744s、16.946s、20.974s、17.409s、17.022s?

20.746s、16.785s、21.114s、18.742s、18.965s?

均值:18.645s?

3.4.2 使用enclave跑帶有大數(shù)組的程序?

將上述帶有大數(shù)組的代碼復(fù)制到Enclave.cpp當(dāng)中(寫在循環(huán)外面),?

核心代碼:?

void ecall_calculate_from_enclave(){ ? int a[4096][4096] = {0};? int b[4096][4096] = {1};? a[0][0] = 1;? size_t num = sizeof(a);? a[0][1] = num;? b[0][0] = a[0][1];? for (int j = 0; j < 10000; ++j) {? calculate_prime();? }?}?

實(shí)驗(yàn)結(jié)果:?

正常情況cpu使用率:20%(均值)?

運(yùn)行代碼程序后cpu使用率:90%(均值)?

代碼運(yùn)行結(jié)果(10次)?

26.264s、26.043s、24.434s、28.206s、23.204s?

22.236s、26.238s、25.232s、23.364s、24.652s?

均值:24.987s?

四.實(shí)驗(yàn)結(jié)論?

通過(guò)上述實(shí)驗(yàn)可以發(fā)現(xiàn)使用SGX安全插件的app應(yīng)用來(lái)計(jì)算10000以內(nèi)的素?cái)?shù)(10000次)用的時(shí)間比不使用插件要多,cpu使用率也要高一些,但是性能損耗在5%到10%之間,性能損耗可以接受。如果頻繁使用ecall函數(shù)或者ocall函數(shù),在可信區(qū)和非可信區(qū)之間進(jìn)行切換,會(huì)有比較明顯的性能消耗,性能損耗在20%以上。當(dāng)epc內(nèi)存過(guò)大也會(huì)明顯影響主機(jī)的性能。性能損耗20%以上。?

標(biāo)簽: 正常情況 實(shí)驗(yàn)結(jié)果 運(yùn)行程序

上一篇:當(dāng)前報(bào)道:【SpringBoot實(shí)戰(zhàn)專題】「開發(fā)實(shí)戰(zhàn)系列」從零開始教你舒服的使用RedisTemplate操作Redis數(shù)據(jù)
下一篇:如何制作一個(gè)羊了個(gè)羊游戲3:卡牌拾取和消除