1. 程式人生 > >華為ARM64伺服器上手體驗--不吹不黑,用實際應用來看看TaiShan鯤鵬的表現

華為ARM64伺服器上手體驗--不吹不黑,用實際應用來看看TaiShan鯤鵬的表現

背景

中美貿易衝突以來,相信最大的感受,並不是我對你加多少關稅,而是我有,可我不賣給你。“禁售”成了市場經濟中最大的競爭力。
相信也是因為這個原因,華為“備胎轉正”的鯤鵬系列晶片,一經推出,就吸引了業界的眼球。
經過漫長的等待,基於鯤鵬920,代表高階計算能力的華為伺服器已經開始大量出貨。不過,限於專業壁壘,伺服器用的晶片,無論如何也比不上5G和MATE30更令人矚目。
今天偶然發現,華為雲上正在進行“鯤鵬彈性雲伺服器”免費試用活動,於是迅速的申請了一臺嚐鮮。

基本環境

最基本的試用套餐中,包括一臺1核、1G記憶體、1M頻寬的彈性伺服器;一個100G的雲硬碟還有一個動態的公網IP。個人使用者可以免費試用15天。

伺服器可選多種作業系統,華為推薦的是自有的尤拉作業系統(EulerOS)。這是華為基於CentOS定製的版本,包含了多種伺服器場景的優化,對於ARM64晶片也有更好的支援。其它還有10餘種選擇,都是Linux類的各種發行版本。
嚴重依賴Windows系列的話...你現在可以退散了,除了Windows作業系統當前還繫結在X86系列CPU之上,微軟系列也屬禁售之列。
作為試用,首先要“玩”起來方便,我選擇了Ubuntu18.04系統。

跟常見的雲端系統一樣,購買完成,伺服器會快速的自己完成配置、啟動。華為雲提供了基於瀏覽器的終端介面:

一開始只有一個root,利用瀏覽器的終端,新建一個日常使用的賬號,升級各項更新和補丁,重啟,然後可以放心安全的在遠端使用ssh登陸了。有一個動態公網IP,還是方便很多。
整個過程流暢、穩定,第一印象跟通常使用的伺服器並沒有什麼不同。如果不使用uname檢查核心,完全感覺不到是一臺ARM伺服器。

$ uname -a
Linux ecs-kc1-small-1-linux-20191209185931 4.15.0-72-generic #81-Ubuntu SMP Tue Nov 26 12:21:09 UTC 2019 aarch64 aarch64 aarch64 GNU/Linux

先來看看配置,CPU:

$ cat /proc/cpuinfo
processor   : 0
BogoMIPS    : 200.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm
CPU implementer : 0x48
CPU architecture: 8
CPU variant : 0x1
CPU part    : 0xd01
CPU revision    : 0

接著是記憶體:

$ cat /proc/meminfo
MemTotal:        1006904 kB
MemFree:          387044 kB
MemAvailable:     671300 kB
Buffers:           33604 kB
Cached:           296076 kB
SwapCached:         1148 kB
Active:           217232 kB
Inactive:         275692 kB
Active(anon):      59824 kB
Inactive(anon):   119960 kB
Active(file):     157408 kB
Inactive(file):   155732 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       1762696 kB
SwapFree:        1729472 kB
Dirty:             28632 kB
Writeback:             0 kB
AnonPages:        162892 kB
Mapped:            61680 kB
Shmem:             16508 kB
Slab:              96464 kB
SReclaimable:      60696 kB
SUnreclaim:        35768 kB
KernelStack:        2464 kB
PageTables:         3824 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2266148 kB
Committed_AS:    1049036 kB
VmallocTotal:   135290290112 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

雖說只是一個體驗,但如果沒有對比,我們很難對“體驗”結果做出一個公正的評價。
所以我又在國內三甲的雲服務商(這裡就不提名字了,反正沒有打擂臺的意思)另外借用了一臺生產用傳統Intel至強的伺服器。
同樣使用Ubuntu 18:

$ uname -a
Linux ebs-31389 4.15.0-72-generic #81-Ubuntu SMP Tue Nov 26 12:20:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

CPU:

$ cat /proc/cpuinfo 
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 63
model name  : Intel(R) Xeon(R) CPU E5-2678 v3 @ 2.50GHz
stepping    : 2
microcode   : 0x1
cpu MHz     : 2494.224
cache size  : 4096 KB
physical id : 0
siblings    : 1
core id     : 0
cpu cores   : 1
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single pti fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat
bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips    : 4988.44
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 63
model name  : Intel(R) Xeon(R) CPU E5-2678 v3 @ 2.50GHz
stepping    : 2
microcode   : 0x1
cpu MHz     : 2494.224
cache size  : 4096 KB
physical id : 1
siblings    : 1
core id     : 0
cpu cores   : 1
apicid      : 1
initial apicid  : 1
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single pti fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat
bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips    : 4988.44
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

記憶體:

$ cat /proc/meminfo 
MemTotal:        4039500 kB
MemFree:         1083580 kB
MemAvailable:    3561040 kB
Buffers:          206180 kB
Cached:          2326624 kB
SwapCached:          296 kB
Active:          1394884 kB
Inactive:        1213580 kB
Active(anon):      40644 kB
Inactive(anon):    53080 kB
Active(file):    1354240 kB
Inactive(file):  1160500 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       4038652 kB
SwapFree:        4033008 kB
Dirty:                20 kB
Writeback:             0 kB
AnonPages:         75392 kB
Mapped:            88396 kB
Shmem:             18068 kB
Slab:             305188 kB
SReclaimable:     251528 kB
SUnreclaim:        53660 kB
KernelStack:        2704 kB
PageTables:         8312 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     6058400 kB
Committed_AS:     597368 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      106368 kB
DirectMap2M:     4087808 kB
DirectMap1G:     2097152 kB

從硬體引數上看,“鯤鵬”很不利啊,可憐的1核1G記憶體。另一臺Intel XEON雖說也不是啥高階貨色,但2核4G記憶體,任誰看起來也是碾壓式的對手。如果知道我只能借到這樣一臺對比的伺服器,在華為雲就應當開一臺配置更高的機器。可惜免費機會僅有一次,也只能硬起頭皮繼續了。

主機 TaiShan 競品品牌未知
CPU 鯤鵬920 Intel Xeon
核心數量 1 2
記憶體 1G 4G

其它配置就不拉出來看了,因為剩下的硬體對本次對比影響不大;軟體配置,都是預設的基礎系統,兩邊都沒有做任何專門的設定和調優。如果有區別,那也是雲端工作人員水平的發揮,也得算加分項。

體驗內容和環境準備

早先還是很喜歡看跑分,後來時間長了,發現跑分的內容,跟實際工作區別還是比較大。往往跑分的指標很漂亮,真正用起來,滿不是那麼回事。
所以今天我們搞的稍微複雜一點,選擇從前端開發、後端開發及服務、容器三個方面,對鯤鵬伺服器做一個深度體驗。我想從雲服務的角度上說,這三類應用,怎麼也能涵蓋80%的常見需求吧。
(文中沿用口頭習慣混用了晶片品牌和伺服器品牌,相信你看的懂,就不再改了。)

首先我們準備相應的工具和環境。
前端開發選用node.js/npm/yarn工具鏈,vue框架。兩臺機器的版本完全相同:

$ node -v
v12.13.1
$ npm -v
6.12.1
$ yarn -v
1.21.0

後端選用PostgreSQL資料庫,兩端版本相同:

$ psql --version
psql (PostgreSQL) 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)

後端工具鏈使用Rust nightly編譯,兩端相同:

$ rustc -V
rustc 1.41.0-nightly (59947fcae 2019-12-08)

這裡補充一句,nightly只適合開發和實驗,請勿在生產環境使用。這裡考慮既然是體驗,當然要有適度的超前,所以選用nightly版本。因為畢竟等到你用的時候,今天的nightly版本估計已經轉正了。
在後端開發的過程中,還會使用到gcc/git/openssl等開源工具鏈。都使用了Ubuntu內建的版本,兩臺伺服器相同。因為這些工具並非主要開發環境,這裡節省篇幅,就不一一列出版本了。

容器方面,因為更多是相容性體驗,並不需要什麼指標資料,所以只安裝了鯤鵬伺服器,版本如下:

$ sudo docker version
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.1
 Git commit:        2d0083d
 Built:             Fri Aug 16 14:20:24 2019
 OS/Arch:           linux/arm64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.1
  Git commit:       2d0083d
  Built:            Wed Aug 14 19:41:23 2019
  OS/Arch:          linux/arm64
  Experimental:     false

本文不是教學,所以安裝過程都忽略。值得一提的是,兩臺伺服器在環境搭建的過程中,表現的都很流暢快捷,操作完全相同。常常需要專門看一眼主機名才能想的起來這是哪一臺伺服器。跟以往操作一些異構伺服器的時候溝溝坎坎密佈完全不可同日而語。
此外,各工具鏈國內的映象站點對於環境搭建幫助很大,顯著的提高了搭建速度。

試用專案

有習慣使然的因素,這裡用來測試伺服器的專案選用了Gothinkster的RealWorld。RealWorld是一個極簡的微型部落格系統,號稱“應用型演示之母”。是一個麻雀雖小,五臟俱卷的小應用。
在其專案網站上,提供了22種前端和50種後端的開原始碼,任一種前端,都可以配合任一種後端組合工作。
看了前面的環境配置,估計你已經猜到了,我在這裡選擇了Vue的前端和rust-rocket-diesel後端的組合方式。

前端開發

我們先從前端看起,首先把原始碼下載下來:

$ git clone https://github.com/gothinkster/vue-realworld-example-app

然後下載相關的依賴包:

$ cd vue-realworld-example-app
$ yarn install

我們需要對原始碼做4處修改:

  1. 在專案根目錄增加vue.config.js檔案,配置專案在網站中的子路徑,畢竟雖然是試用,直接把根目錄開放給RealWorld也太不講究了。
  2. Vue寫的前端,使用了單網頁結構。不同功能之間,看上去是不同的網頁,實際是Vue截獲URL地址,在螢幕元件之間的切換。為了讓Vue路由工作準確,我們需要修改src/router/index.js檔案,設定路由模式和基礎網頁檔案URL。
  3. 前端同後端之間,使用Restful的介面通訊,我們需要在src/common/config.js檔案中設定這個API基礎地址。
  4. src/store/auth.module.js檔案,UPDATE_USER方法中,有一處BUG。這一處問題同大多數後端配合中體現不出來,但同Rust這種嚴格的後端配合,會導致使用者無法編輯個人資料。需要修改函式中的資料提交部分。

本文不做教學,相信大家也沒興趣看教學,所以具體的修改、配置方法都略過。我們只來看編譯的過程。
首先是在鯤鵬伺服器上:

$ time yarn build
yarn run v1.21.0
$ cross-env BABEL_ENV=dev vue-cli-service build

⠇  Building for production...

  File                                      Size             Gzipped

  dist/js/chunk-vendors.dcd10e99.js         172.11 KiB       58.87 KiB
  dist/js/chunk-52fabea2.8d54de7e.js        35.24 KiB        10.74 KiB
  dist/js/app.5e06b01a.js                   19.41 KiB        5.56 KiB
  dist/js/chunk-8ab06c80.0691ea34.js        13.74 KiB        4.53 KiB
  dist/js/chunk-fee37f4e.962c341f.js        5.50 KiB         1.80 KiB
  dist/js/chunk-2d0b3289.4ecc4d5e.js        3.68 KiB         1.17 KiB
  dist/js/chunk-2d217357.a492fd23.js        3.20 KiB         1.15 KiB
  dist/js/chunk-704fe663.1eb6fa07.js        2.94 KiB         1.14 KiB
  dist/js/chunk-2d0d6d35.3e7333df.js        2.92 KiB         1.15 KiB
  dist/js/chunk-2d2086b7.9e172229.js        2.57 KiB         1.12 KiB
  dist/precache-manifest.d3673753a0030f7    1.66 KiB         0.55 KiB
  ef7bc3318dfea2bf8.js
  dist/service-worker.js                    0.95 KiB         0.54 KiB
  dist/js/chunk-2d0bd246.4cab42ec.js        0.58 KiB         0.40 KiB
  dist/js/chunk-2d0f1193.580d39c8.js        0.57 KiB         0.40 KiB
  dist/js/chunk-2d0cedd0.a32d9392.js        0.53 KiB         0.38 KiB
  dist/js/chunk-2d207fb4.d8669731.js        0.48 KiB         0.35 KiB
  dist/js/chunk-2d0bac97.f736bcaf.js        0.48 KiB         0.35 KiB

  Images and other types of assets omitted.

 DONE  Build complete. The dist directory is ready to be deployed.
 INFO  Check out deployment instructions at https://cli.vuejs.org/guide/deployment.html
                                  
Done in 23.57s.

real    0m23.889s
user    0m19.927s
sys 0m0.965s

為了減少篇幅,日誌資訊刪除了個別原始碼格式的警告資訊。一切都很正常,沒有什麼不相容的現象發生。再來看看Intel的表現:

$ time yarn build
yarn run v1.21.0
$ cross-env BABEL_ENV=dev vue-cli-service build

⠇  Building for production...

  File                                      Size             Gzipped

  dist/js/chunk-vendors.dcd10e99.js         172.11 KiB       58.87 KiB
  dist/js/chunk-52fabea2.c34912e7.js        35.24 KiB        10.74 KiB
  dist/js/app.348e5166.js                   19.35 KiB        5.53 KiB
  dist/js/chunk-8ab06c80.3fa2c5de.js        13.74 KiB        4.53 KiB
  dist/js/chunk-fee37f4e.55893266.js        5.50 KiB         1.80 KiB
  dist/js/chunk-2d0b3289.7b3abcbe.js        3.68 KiB         1.17 KiB
  dist/js/chunk-2d217357.e2eb7ad1.js        3.20 KiB         1.14 KiB
  dist/js/chunk-704fe663.25958462.js        2.94 KiB         1.14 KiB
  dist/js/chunk-2d0d6d35.ddc63fdd.js        2.92 KiB         1.15 KiB
  dist/js/chunk-2d2086b7.35190064.js        2.57 KiB         1.12 KiB
  dist/precache-manifest.049c26b68ee8b9c    1.55 KiB         0.53 KiB
  603c4f04a6cd8e3c8.js
  dist/service-worker.js                    0.95 KiB         0.54 KiB
  dist/js/chunk-2d0bd246.b354ca7f.js        0.58 KiB         0.40 KiB
  dist/js/chunk-2d0f1193.12c44839.js        0.57 KiB         0.40 KiB
  dist/js/chunk-2d0cedd0.ea949ae4.js        0.53 KiB         0.38 KiB
  dist/js/chunk-2d207fb4.245dc458.js        0.48 KiB         0.35 KiB
  dist/js/chunk-2d0bac97.74e3c28d.js        0.48 KiB         0.35 KiB

  Images and other types of assets omitted.

 DONE  Build complete. The dist directory is ready to be deployed.
 INFO  Check out deployment instructions at https://cli.vuejs.org/guide/deployment.html
                                  
Done in 16.27s.

real    0m16.548s
user    0m20.435s
sys 0m1.223s

到底多一顆核心和4倍的記憶體,編譯速度快了約30%。
考慮到雙方的硬體配置,我主觀覺得算兩家平手說得上公平。

後端開發

首先也是自倉庫下載原始碼。
接著要做這樣幾件事情:

  1. 後端原來只有一組Restful介面的服務,我們需要讓它能直接提供靜態檔案服務,否則還要另外配置一個靜態檔案服務來容納剛才編譯好的前端檔案。我修改了src/lib.rs程式,增加了處理函式,將./static/資料夾開放為靜態檔案路徑。
  2. 將Vue前端編譯的結果,是在Vue專案的dist/路徑中,完整拷貝到當前專案的static/目錄。
  3. 根據程式碼倉庫網頁的說明,配置PostgreSQL服務,和使用Diesel ORM工具初始化realworld資料庫。

接下來我們使用Rust的開發模式,來做一個試執行:

$ cargo run

在Intel的伺服器上,這個過程一切正常。而在鯤鵬上,不幸的事情發生了,發生了報錯,日誌過程很長,下面只截取了錯誤資訊的一行:

undefined reference to `rust_crypto_util_fixed_time_eq_asm'

不出乎意料,這是跟彙編有關的東西。
技術發展到今天,在萬能的Linux幫助下,大多的異構系統都能蓬勃發展,前提是,如果不涉及到彙編部分。
為了測試能夠繼續,根據出錯資訊,檢查rust-crypto工具箱原始碼。
很快發現,在rust-crypto-0.2.36/src/util_helpers.c檔案中,只有X64/ARM兩種架構的組合語言。鯤鵬雖然也是ARM,但是aarch64架構,對應的組合語言程式碼並不存在。
因為我對彙編也不熟悉,所以開始在網際網路上各種搜尋。功夫不負有心人,經過大概一小時的努力,在網上找到了一段本函式aarch64的實現:

#ifdef __aarch64__
uint32_t rust_crypto_util_fixed_time_eq_asm(uint8_t* lhsp, uint8_t* rhsp, size_t count) {
    if (count == 0) {
        return 1;
    }
    uint8_t result = 0;
    asm(
        " \
            1: \
            \
            ldrb w4, [%1]; \
            ldrb w5, [%2]; \
            eor w4, w4, w5; \
            orr %w0, %w0, w4; \
            \
            add %w1, %w1, #1; \
            add %w2, %w2, #1; \
            subs %w3, %w3, #1; \
            bne 1b; \
        "
        : "+&r" (result), "+&r" (lhsp), "+&r" (rhsp), "+&r" (count) // all input and output
        : // input
        : "w4", "w5", "cc" // clobbers
    );
    
    return result;
}
#endif

把這段程式碼放進util_helpers.c,再次執行cargo run,realworld執行成功了。

隨便發一個博文:

試執行正常,接下來讓兩家再次展現一下編譯的實力吧。 首先請鯤鵬出場:

$ time cargo build --release
   Compiling libc v0.2.66
   Compiling autocfg v0.1.7
   Compiling cfg-if v0.1.10
    ...(略去)...
   Compiling rocket_cors v0.4.0
   Compiling rocket_contrib v0.4.2
   Compiling realworld v0.4.0 (/home/andrew/dev/realworld-rust-rocket)
    Finished release [optimized] target(s) in 18m 28s

real    18m28.666s
user    18m8.184s
sys 0m10.982s

一共是191個原始碼包,日誌節省篇幅,只列出了其中的6個,編譯耗費時間18分28秒,生成的可執行檔案8.4M。

$ ls -lh target/release/
total 15M
drwxrwxr-x 64 andrew andrew 4.0K Dec 10 09:27 build
drwxrwxr-x  2 andrew andrew  32K Dec 10 09:45 deps
drwxrwxr-x  2 andrew andrew 4.0K Dec 10 09:27 examples
drwxrwxr-x  2 andrew andrew 4.0K Dec 10 09:27 incremental
-rw-rw-r--  1 andrew andrew 1.2K Dec 10 09:45 librealworld.d
-rw-rw-r--  2 andrew andrew 6.2M Dec 10 09:45 librealworld.rlib
-rwxrwxr-x  2 andrew andrew 8.4M Dec 10 09:45 realworld
-rw-rw-r--  1 andrew andrew 1.2K Dec 10 09:45 realworld.d

接著來看Intel的速度:

$ time cargo build --release
   Compiling libc v0.2.65
   Compiling autocfg v0.1.7
   Compiling cfg-if v0.1.10
    ...(略去)...
   Compiling rocket_cors v0.4.0
   Compiling rocket_contrib v0.4.2
   Compiling realworld v0.4.0 (/home/andrew/dev/rust/realworld-rust-rocket)
    Finished release [optimized] target(s) in 7m 39s

real    7m39.088s
user    15m1.126s
sys 0m13.470s

$ ls -lh target/release/
total 16M
drwxrwxr-x 64 andrew andrew 4.0K Dec 10 01:38 build
drwxrwxr-x  2 andrew andrew  36K Dec 10 01:45 deps
drwxrwxr-x  2 andrew andrew 4.0K Dec 10 01:38 examples
drwxrwxr-x  2 andrew andrew 4.0K Dec 10 01:38 incremental
-rw-rw-r--  1 andrew andrew 1.3K Dec 10 01:45 librealworld.d
-rw-rw-r--  2 andrew andrew 6.3M Dec 10 01:45 librealworld.rlib
-rwxrwxr-x  2 andrew andrew 9.0M Dec 10 01:45 realworld
-rw-rw-r--  1 andrew andrew 1.3K Dec 10 01:45 realworld.d

(手動扶額)Intel只花了略超鯤鵬1/3的時間完成編譯,生成的可執行檔案9M。這一次,鯤鵬大比分落後了。

效能測試工具

網際網路應用不同於桌面應用,為了完整對效能進行檢測,我們需要一款獨立的測試工具。
Ubuntu的軟體源中已經集成了一些,不過我選用了Wrk,從原始碼開始編譯一遍,這樣,C/C++的編譯速度和相容情況,也就順便看到了。
以下步驟執行在鯤鵬伺服器上:

# 下載原始碼
$ git clone https://github.com/wg/wrk
# 編譯
$ cd wrk
$ make
$ time make
Building LuaJIT...
make[1]: Entering directory '/home/andrew/dev/wrk/obj/LuaJIT-2.1.0-beta3'
==== Building LuaJIT 2.1.0-beta3 ====
make -C src
make[2]: Entering directory '/home/andrew/dev/wrk/obj/LuaJIT-2.1.0-beta3/src'
HOSTCC    host/minilua.o
HOSTLINK  host/minilua
DYNASM    host/buildvm_arch.h
HOSTCC    host/buildvm.o
HOSTCC    host/buildvm_asm.o
HOSTCC    host/buildvm_peobj.o
HOSTCC    host/buildvm_lib.o
HOSTCC    host/buildvm_fold.o
HOSTLINK  host/buildvm
BUILDVM   lj_vm.S
ASM       lj_vm.o
CC        lj_gc.o
BUILDVM   lj_ffdef.h
CC        lj_err.o
CC        lj_char.o
BUILDVM   lj_bcdef.h
CC        lj_bc.o
  ...
gcc  -I. -Icrypto/include -Iinclude -fPIC -pthread -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/andrew/dev/wrk/obj/ssl\"" -DENGINESDIR="\"/home/andrew/dev/wrk/obj/lib/engines-1.1\"" -DNDEBUG  -MMD -MF crypto/ec/ec_check.d.tmp -MT crypto/ec/ec_check.o -c -o crypto/ec/ec_check.o crypto/ec/ec_check.c
gcc  -I. -Icrypto/include -Iinclude -fPIC -pthread -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/andrew/dev/wrk/obj/ssl\"" -DENGINESDIR="\"/home/andrew/dev/wrk/obj/lib/engines-1.1\"" -DNDEBUG  -MMD -MF crypto/ec/ec_curve.d.tmp -MT crypto/ec/ec_curve.o -c -o crypto/ec/ec_curve.o crypto/ec/ec_curve.c
  ...
gcc  -I. -Iinclude -fPIC -pthread -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/andrew/dev/wrk/obj/ssl\"" -DENGINESDIR="\"/home/andrew/dev/wrk/obj/lib/engines-1.1\"" -DNDEBUG  -MMD -MF ssl/t1_trce.d.tmp -MT ssl/t1_trce.o -c -o ssl/t1_trce.o ssl/t1_trce.c
gcc  -I. -Iinclude -fPIC -pthread -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/andrew/dev/wrk/obj/ssl\"" -DENGINESDIR="\"/home/andrew/dev/wrk/obj/lib/engines-1.1\"" -DNDEBUG  -MMD -MF ssl/tls13_enc.d.tmp -MT ssl/tls13_enc.o -c -o ssl/tls13_enc.o ssl/tls13_enc.c
gcc  -I. -Iinclude -fPIC -pthread -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/andrew/dev/wrk/obj/ssl\"" -DENGINESDIR="\"/home/andrew/dev/wrk/obj/lib/engines-1.1\"" -DNDEBUG  -MMD -MF ssl/tls_srp.d.tmp -MT ssl/tls_srp.o -c -o ssl/tls_srp.o ssl/tls_srp.c
  ...(略去)...
make depend && make _build_engines
make[2]: Entering directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
make[2]: Leaving directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
make[2]: Entering directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
make[2]: Nothing to be done for '_build_engines'.
make[2]: Leaving directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
created directory `/home/andrew/dev/wrk/obj/lib/engines-1.1'
*** Installing engines
make depend && make _build_programs
make[2]: Entering directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
make[2]: Leaving directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
make[2]: Entering directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
make[2]: Nothing to be done for '_build_programs'.
make[2]: Leaving directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
*** Installing runtime programs
install apps/openssl -> /home/andrew/dev/wrk/obj/bin/openssl
install ./tools/c_rehash -> /home/andrew/dev/wrk/obj/bin/c_rehash
make[1]: Leaving directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
CC src/wrk.c
CC src/net.c
CC src/ssl.c
CC src/aprintf.c
CC src/stats.c
CC src/script.c
CC src/units.c
CC src/ae.c
CC src/zmalloc.c
CC src/http_parser.c
LUAJIT src/wrk.lua
LINK wrk

real    3m31.575s
user    3m6.914s
sys 0m22.147s

這個小工具包含了大量的c語言原始碼和部分彙編程式碼,少量的lua腳本當做資料檔案存在。
鯤鵬的編譯過程耗時3分32秒。
接著是Intel至強:

$ time make
Building LuaJIT...
make[1]: Entering directory '/home/andrew/dev/wrk/obj/LuaJIT-2.1.0-beta3'
==== Building LuaJIT 2.1.0-beta3 ====
make -C src
make[2]: Entering directory '/home/andrew/dev/wrk/obj/LuaJIT-2.1.0-beta3/src'
HOSTCC    host/minilua.o
HOSTLINK  host/minilua
DYNASM    host/buildvm_arch.h
HOSTCC    host/buildvm.o
HOSTCC    host/buildvm_asm.o
HOSTCC    host/buildvm_peobj.o
HOSTCC    host/buildvm_lib.o
HOSTCC    host/buildvm_fold.o
HOSTLINK  host/buildvm
BUILDVM   lj_vm.S
ASM       lj_vm.o
CC        lj_gc.o
BUILDVM   lj_ffdef.h
CC        lj_err.o
CC        lj_char.o
  ......
CC="gcc" /usr/bin/perl crypto/aes/asm/aesni-mb-x86_64.pl elf crypto/aes/aesni-mb-x86_64.s
gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/andrew/dev/wrk/obj/ssl\"" -DENGINESDIR="\"/home/andrew/dev/wrk/obj/lib/engines-1.1\"" -DNDEBUG  -c -o crypto/aes/aesni-mb-x86_64.o crypto/aes/aesni-mb-x86_64.s
CC="gcc" /usr/bin/perl crypto/aes/asm/aesni-sha1-x86_64.pl elf crypto/aes/aesni-sha1-x86_64.s
gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/andrew/dev/wrk/obj/ssl\"" -DENGINESDIR="\"/home/andrew/dev/wrk/obj/lib/engines-1.1\"" -DNDEBUG  -c -o crypto/aes/aesni-sha1-x86_64.o crypto/aes/aesni-sha1-x86_64.s
  ......
gcc  -I. -Icrypto/include -Iinclude -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/andrew/dev/wrk/obj/ssl\"" -DENGINESDIR="\"/home/andrew/dev/wrk/obj/lib/engines-1.1\"" -DNDEBUG  -MMD -MF crypto/asn1/x_pkey.d.tmp -MT crypto/asn1/x_pkey.o -c -o crypto/asn1/x_pkey.o crypto/asn1/x_pkey.c
gcc  -I. -Icrypto/include -Iinclude -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/andrew/dev/wrk/obj/ssl\"" -DENGINESDIR="\"/home/andrew/dev/wrk/obj/lib/engines-1.1\"" -DNDEBUG  -MMD -MF crypto/asn1/x_sig.d.tmp -MT crypto/asn1/x_sig.o -c -o crypto/asn1/x_sig.o crypto/asn1/x_sig.c
  ...(略)...
make depend && make _build_programs
make[2]: Entering directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
make[2]: Leaving directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
make[2]: Entering directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
make[2]: Nothing to be done for '_build_programs'.
make[2]: Leaving directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
*** Installing runtime programs
install apps/openssl -> /home/andrew/dev/wrk/obj/bin/openssl
install ./tools/c_rehash -> /home/andrew/dev/wrk/obj/bin/c_rehash
make[1]: Leaving directory '/home/andrew/dev/wrk/obj/openssl-1.1.1b'
CC src/wrk.c
CC src/net.c
CC src/ssl.c
CC src/aprintf.c
CC src/stats.c
CC src/script.c
CC src/units.c
CC src/ae.c
CC src/zmalloc.c
CC src/http_parser.c
LUAJIT src/wrk.lua
LINK wrk

real    3m48.678s
user    3m9.735s
sys 0m37.941s
andrew@ebs-31389:~/dev/wrk$ 

咦?3分48秒,居然略慢於鯤鵬。
其實認真分析一下,我覺得也是正常的。從官方公佈的資料來看,鯤鵬的核心效能並不差,如果任務比較小,在記憶體中就能完成,那鯤鵬的速度顯然就應當快。
而如果任務比較大,導致了大量的磁碟交換,我們選用的這臺低配鯤鵬就撐不住了,再加上只有一顆核心的配置。最終的結果,任務越大,這臺鯤鵬被落下就越多。

好了,測試工具準備完畢,我們分別對兩臺伺服器的Web服務效能做一個測試吧。相信對於雲端主機來講,這個才是硬槓槓啊。
把兩邊的伺服器都啟動起來:

首先來看鯤鵬的測試資料:

$ wrk -t1 -c50 -d5s --latency --timeout 2s http://localhost:8000/index.html
Running 5s test @ http://localhost:8000/index.html
  1 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.97ms    1.04ms   4.58ms   57.80%
    Req/Sec     8.79k   228.58     9.09k    70.00%
  Latency Distribution
     50%    1.97ms
     75%    2.87ms
     90%    3.41ms
     99%    3.78ms
  44400 requests in 5.08s, 120.47MB read
  Socket errors: connect 0, read 44400, write 0, timeout 0
Requests/sec:   8745.40
Transfer/sec:     23.73MB

兩臺伺服器的配置區別比較大,公平起見,我們在引數上只啟用了一個執行緒。連線數選擇50個,我想對於一個小型網站,這可能是比較典型的數量。
鯤鵬伺服器在5.08秒的測試中,承受了44400個請求,一共傳送資料120.47MB。

接著Intel站上前臺:

$ wrk -t1 -c50 -d5s --latency --timeout 2s http://localhost:8000/index.html
Running 5s test @ http://localhost:8000/index.html
  1 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    32.32ms    5.00ms  64.20ms   75.23%
    Req/Sec     1.52k   176.64     1.91k    72.00%
  Latency Distribution
     50%   31.52ms
     75%   34.64ms
     90%   38.67ms
     99%   48.04ms
  7552 requests in 5.00s, 21.97MB read
  Socket errors: connect 0, read 7550, write 0, timeout 0
Requests/sec:   1509.75
Transfer/sec:      4.39MB

哇咔咔...有沒有驚掉眼球?真是沒有對比就沒有傷害。在5秒的測試中,Intel Xeon只承受了7552個請求,傳送資料21.97MB。作為一個老牌的CPU大廠,Intel你丟不丟“芯”?

index.html只是一個靜態頁面,我們換一個動態連結再來看看,這樣資料庫的部分也就能一起提現了。
下面測試的就是一個Restful介面,用於列出文章內容的:

$ curl http://127.0.0.1:8000/api/articles
{"articles":[{"author":{"bio":null,"email":"[email protected]","id":1,"image":null,"username":"andrew"},"body":"蘋果公司近日宣佈,新的Mac Pro和Pro Display XDR將於12月10日開始訂購。新的Mac Pro起價為5,999美元(約合人民幣42202元),而Pro Display XDR起價為4,999美元(約合人民幣35167元)。\n5,999美元的基本款Mac Pro搭載了8核Intel Xeon處理器,256 GB SSD,32GB RAM等配置。最高配置支援28核Intel Xeon處理器,4塊Vega顯示卡,1.5TB的超大容量記憶體。而其首次引入的Apple Afterburner加速卡,這使得Mac Pro可實時解碼最多達 3 條 8K ProRes RAW 視訊流和最多達 12 條 4K ProRes RAW 視訊流。\n而新款的 Pro Display XDR則配置了解析度達到6016 x 3384的32英寸顯示屏,這款顯示器的引數達到了靜態 1000nit / 峰值 1600nits 的亮度,同時還有著1000000:1的對比度。如果使用者追求低反射率和低眩光,可以多加1000美元(約合人民幣7000元)給顯示器新增一個“奈米紋理”啞光塗層。","createdAt":"2019-12-10T02:05:38.758Z","description":"nothing but test","favorited":false,"favoritesCount":0,"id":1,"slug":"test-sqzxyV","tagList":[],"title":"test","updatedAt":"2019-12-10T02:05:38.758Z"}],"articlesCount":1}

同樣,先看看鯤鵬的表現:

$ wrk -t1 -c50 -d5s --latency --timeout 2s http://127.0.0.1:8000/api/articles
Running 5s test @ http://127.0.0.1:8000/api/articles
  1 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    40.03ms    2.37ms  41.82ms   99.15%
    Req/Sec     1.25k    11.16     1.27k    66.00%
  Latency Distribution
     50%   40.21ms
     75%   40.48ms
     90%   40.75ms
     99%   41.34ms
  6199 requests in 5.00s, 8.92MB read
  Socket errors: connect 0, read 6198, write 0, timeout 0
Requests/sec:   1239.54
Transfer/sec:      1.78MB

Intel登場:

$ wrk -t1 -c50 -d5s --latency --timeout 2s http://127.0.0.1:8000/api/articles
Running 5s test @ http://127.0.0.1:8000/api/articles
  1 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    62.63ms    9.18ms  96.45ms   72.66%
    Req/Sec   787.82     95.11     1.01k    72.00%
  Latency Distribution
     50%   62.32ms
     75%   68.07ms
     90%   74.42ms
     99%   85.25ms
  3921 requests in 5.01s, 5.64MB read
  Socket errors: connect 0, read 3920, write 0, timeout 0
Requests/sec:    783.09
Transfer/sec:     1.13MB

發的帖子太短了,資料流很小,時間全消耗在連結上了,有點體現不出來實力。....不過...鯤鵬再次大比分領先。同時你還別忘了,這臺測試的鯤鵬伺服器,記憶體只有Intel競品的1/4,以及1/2CPU核心。
從這些資料,我想負責任的說,國產晶片和國產伺服器的雲端實力,穩了。

容器體驗

以容器為基礎的微服務已經是今天伺服器運營的主流模式。在這方面鯤鵬伺服器應當說很幸運。畢竟只是在Linux核心就能實現的cgroup和namespace比需要模擬指令集的VM技術容易的多。可說是與生俱來。
但問題也並不這麼簡單,比如你隨便搜尋一個應用:

# docker search mariadb
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mariadb                                MariaDB is a community-developed fork of MyS…   3135                [OK]                
bitnami/mariadb                        Bitnami MariaDB Docker Image                    107                                     [OK]
linuxserver/mariadb                    A Mariadb container, brought to you by Linux…   95                                      
toughiq/mariadb-cluster                Dockerized Automated MariaDB Galera Cluster …   41                                      [OK]
colinmollenhour/mariadb-galera-swarm   MariaDb w/ Galera Cluster, DNS-based service…   26                                      [OK]
panubo/mariadb-galera                  MariaDB Galera Cluster                          23                                      [OK]
lsioarmhf/mariadb                      ARMHF based Linuxserver.io image of mariadb     18                                      
mariadb/server                         MariaDB Server is a modern database for mode…   18                                      [OK]
webhippie/mariadb                      Docker images for MariaDB                       16                                      [OK]
bianjp/mariadb-alpine                  Lightweight MariaDB docker image with Alpine…   12                                      [OK]
centos/mariadb-101-centos7             MariaDB 10.1 SQL database server                10                                      
severalnines/mariadb                   A homogeneous MariaDB Galera Cluster image t…   7                                       [OK]
centos/mariadb-102-centos7             MariaDB 10.2 SQL database server                6                                       
tutum/mariadb                          Base docker image to run a MariaDB database …   4                                       
wodby/mariadb                          Alpine-based MariaDB container image with or…   4                                       [OK]
circleci/mariadb                       CircleCI images for MariaDB                     3                                       [OK]
tiredofit/mariadb-backup               MariaDB Backup image to backup MariaDB/MySQL…   2                                       [OK]
kitpages/mariadb-galera                MariaDB with Galera                             2                                       [OK]
rightctrl/mariadb                      Mariadb with Galera support                     2                                       [OK]
jonbaldie/mariadb                      Fast, simple, and lightweight MariaDB Docker…   2                                       [OK]
demyx/mariadb                          Non-root Docker image running Alpine Linux a…   0                                       
ccitest/mariadb                        CircleCI test images for MariaDB                0                                       [OK]
jelastic/mariadb                       An image of the MariaDB SQL database server …   0                                       
ansibleplaybookbundle/mariadb-apb      An APB which deploys RHSCL MariaDB              0                                       [OK]
alvistack/mariadb                       Docker Image Packaging for MariaDB             0        

嗯嗯,看起來跟x86伺服器沒有什麼區別。但是想拉一個下來試試?親,你還是算了吧。容器映像中打包的可是二進位制的執行檔案,是要區別CPU的,拉下來你也用不了。
看起來,這個世界還沒有為ARM伺服器的到來做好準備,至少也應當像APT/YUM之類的工具一樣,自動區分架構來準備資源池不是?

所以想要找適合鯤鵬伺服器的映像檔案,需要手動新增關鍵字搜尋。
當前Docker Hub有兩個分類適用64位ARM伺服器架構,分別是aarch64arm64v8,其中aarch64分類已經不再使用,新上架的映像都歸類到了arm64v8。但因為相容性考慮,aarch64分類原有映像仍然都存在。換句話說,如果兩個分類都有你需要的映像,你應當優先選擇arm64v8分類下面的。
接著,第二個小問題就來了,使用這兩個關鍵字來搜尋:

# docker search aarch64
NAME                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
homeassistant/aarch64-homeassistant                                                       15                                      
aarch64/ubuntu                            Ubuntu is a Debian-based Linux operating sys…   14                                      
homeassistant/aarch64-hassio-supervisor                                                   5                                       
balenalib/aarch64-ubuntu-node             This image is part of the balena.io base ima…   1                                       
balenalib/aarch64-alpine-python           This image is part of the balena.io base ima…   1                                       
resin/aarch64-alpine-python               This repository is deprecated.                  1                                       
resin/aarch64-python                      This repository is deprecated.                  1                                       
resin/aarch64-alpine-buildpack-deps       This repository is deprecated.                  0                                       
resin/aarch64-ubuntu-golang               This repository is deprecated.                  0                                       
resin/aarch64-fedora-buildpack-deps       This repository is deprecated.                  0                                       
resin/aarch64-fedora-python               This repository is deprecated.                  0                                       
resin/aarch64-alpine-openjdk              This repository is deprecated.                  0                                       
balenalib/aarch64-alpine-node             This image is part of the balena.io base ima…   0                                       
resin/aarch64-fedora-golang               This repository is deprecated.                  0                                       
resin/aarch64-golang                      This repository is deprecated.                  0                                       
resin/aarch64-fedora-openjdk              This repository is deprecated.                  0                                       
resin/aarch64-alpine-golang               This repository is deprecated.                  0                                       
balenalib/aarch64-node                    This image is part of the balena.io base ima…   0                                       
balenalib/aarch64-debian-node             This image is part of the balena.io base ima…   0                                       
resin/aarch64-fedora-node                 This repository is deprecated.                  0                                       
resin/aarch64-node                        This repository is deprecated.                  0                                       
resin/aarch64-ubuntu-python               This repository is deprecated.                  0                                       
balenalib/aarch64-ubuntu-golang           This image is part of the balena.io base ima…   0                                       
resin/aarch64-alpine-node                 This repository is deprecated.                  0                                       
balenalib/aarch64-debian-python           This image is part of the balena.io base ima…   0       

# docker search arm64v8
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
arm64v8/alpine                         A minimal Docker image based on Alpine Linux…   45                                      
arm64v8/ubuntu                         Ubuntu is a Debian-based Linux operating sys…   30                                      
arm64v8/debian                         Debian is a Linux distribution thats compos…   21                                      
arm64v8/nginx                          Official build of Nginx.                        18                                      
arm64v8/python                         Python is an interpreted, interactive, objec…   18                                      
arm64v8/nextcloud                      A safe home for all your data                   15                                      
arm64v8/node                           Node.js is a JavaScript-based platform for s…   12                                      
arm64v8/openjdk                        OpenJDK is an open-source implementation of …   9                                       
arm64v8/redis                          Redis is an open source key-value store that…   7                                       
arm64v8/php                            While designed for web development, the PHP …   7                                       
arm64v8/mongo                          MongoDB document databases provide high avai…   6                                       
arm64v8/golang                         Go (golang) is a general purpose, higher-lev…   6                                       
arm64v8/docker                         Docker in Docker!                               6                                       
arm64v8/ros                            The Robot Operating System (ROS) is an open …   5                                       
arm64v8/buildpack-deps                 A collection of common build dependencies us…   3                                       
arm64v8/busybox                        Busybox base image.                             3                                       
arm64v8/ruby                           Ruby is a dynamic, reflective, object-orient…   2                                       
arm64v8/tomcat                         Apache Tomcat is an open source implementati…   2                                       
arm64v8/erlang                         Erlang is a programming language used to bui…   1                                       
arm64v8/wordpress                      The WordPress rich content management system…   1                                       
arm64v8/joomla                         Joomla! is an open source content management…   0                                       
arm64v8/haxe                           Haxe is a modern, high level, static typed p…   0                                       
troyfontaine/arm64v8_min-alpinelinux   Minimal 64-bit ARM64v8 Alpine Linux Image       0                                       
arm64v8/hylang                         Hy is a Lisp dialect that translates express…   0                                       
arm64v8/perl                           Perl is a high-level, general-purpose, inter…   0                             

你會發現,比起來豐饒的x86社群,arm伺服器的資源是在是少的可憐,而且大多是基礎性的映像。
這恐怕是沒有辦法的事情了,使用者少,資源也就少。好在,有了基礎映像,自己新增應用,也沒有什麼不能接受。想一想,哪一個關鍵應用你敢直接完整使用社群映像?
同樣因為Docker Hub在架構區分上準備不足的問題,現在使用docker search命令直接搜尋映像已經很不方便了。因為除了映像的關鍵字,我們又多了一個架構的限定。
所以建議直接到對應網頁搜尋:
https://hub.docker.com/u/aarch64還有 https://hub.docker.com/u/arm64v8

下面我們試驗用arm64v8分類的Docker映像,執行一個常見的WordPress應用,來體驗一下鯤鵬伺服器在容器方面的表現。
WordPress應用需要兩個容器,一個部署了Apache/PHP和WordPress本身;另外還需要一個MySQL相容的資料庫,我們使用其社群開源版本MariaDB。
首先把映像拉下來:

# docker pull arm64v8/wordpress
Using default tag: latest
latest: Pulling from arm64v8/wordpress
a4f3dd4087f9: Pull complete 
e54f8c59bdae: Pull complete 
6ae19fe01dd7: Pull complete 
939a6e43e07c: Pull complete 
c7bc60aacdf3: Pull complete 
c1e1bedfb04e: Pull complete 
8332b8441264: Pull complete 
012fa89ca2bc: Pull complete 
c0dfb13372af: Pull complete 
3cbeabdc4805: Pull complete 
8e492268eedf: Pull complete 
db2ddafb0478: Pull complete 
a02565d248c3: Pull complete 
7e8259639516: Pull complete 
3efb6c94a4c9: Pull complete 
77f6d83e6c7a: Pull complete 
3601f2116010: Pull complete 
4ec7c7d8a180: Pull complete 
b834909e81a9: Pull complete 
72c2b2a88763: Pull complete 
d77d0ee96a04: Pull complete 
Digest: sha256:28e7d4a7b3ba0d55f151e718e84de5f186b0c65adaac2da9005a64cb6ad82de8
Status: Downloaded newer image for arm64v8/wordpress:latest

# docker pull arm64v8/mariadb
Using default tag: latest
latest: Pulling from arm64v8/mariadb
6531af355894: Pull complete 
82f7942d2fb7: Pull complete 
fdce94e690d5: Pull complete 
a96a89ada1c3: Pull complete 
9bcef89e3002: Pull complete 
06115e3e56a0: Pull complete 
5712e955a6d4: Pull complete 
afd2dc9f5e8f: Pull complete 
07ef8ef990de: Pull complete 
ae55899885f1: Pull complete 
9c16c03a30d3: Pull complete 
5f1431dbf111: Pull complete 
58fecc1c9379: Pull complete 
1c94839aac8b: Pull complete 
Digest: sha256:c67410e8deeb6e165c867131c7669155e43b532d441120df2bbf4f12a3710cd7
Status: Downloaded newer image for arm64v8/mariadb:latest

隨後先執行資料庫映像,執行的時候在環境引數設定root賬號密碼、新建普通使用者賬號、還有為WordPress單獨見一個庫。我們不會在宿主機操作資料庫,所以就不再對映端口出來了:

# docker run -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=wpuserpassword -e MYSQL_DATABASE=wordpressdb --name wordpressdb -d arm64v8/mariadb
51e6d43af860e00c45cce81bed1918ae3c2a5c91bdcfca18203b0486d8f2783d

接著執行WordPress容器,在環境變數中把剛才建立的普通資料庫使用者賬號傳遞進去,同時把WordPress容器連線到剛才的資料庫容器,這是為了讓它們之間直接使用Docker內部網路連線起來,不用通過宿主機中轉:

# docker run -e WORDPRESS_DB_USER=wpuser -e WORDPRESS_DB_PASSWORD=wpuserpassword -e WORDPRESS_DB_NAME=wordpressdb -p 8080:80 --link wordpressdb:mysql --name wordpress -d arm64v8/wordpress
83cad21cf2a057273440cb919885c061b77711b4baedb64fd7bff683a1a30177

這樣,一個微型部落格就搭建好了。開瀏覽器來看看:

先要進行一些必要的基礎設定,只是站點資訊類的。因為剛才執行容器的時候就把資料庫的設定傳遞了進去,所以資料庫設定的Web頁面根本就不會出現。
設定完成開啟網站首頁:

工作的挺好。

整個搭建的過程,除了兩個映像的名字多了arm64v8字首,其它從配置、到使用,跟X86伺服器沒有任何不同。

總結

幾個體量不大的應用,顯然無法代表全部,但自認為比通常的測試軟體表現的要更豐滿。
說一說自己的體會:

  • 鯤鵬920表現亮眼,很有驚喜。在常見的雲端企業級應用中完全能擔當主力。
  • 常規的指令碼語言、虛機類語言完全不用擔心相容性,上手即用,開機就能跑。
  • 常規的C/C++/Rust這些編譯到二進位制的語言,也不用有壓力,我相信99%的企業級應用都能相容。
  • 涉及到彙編的部分,aarch64彙編是個障礙,無論是自己新研發還是社群找資源,都需要慢慢積累。
  • 容器社群資源明顯不足,對依賴社群資源的小團隊稍有打擊,對企業應用影響不大。

試用完成,最後祝TaiShan伺服器和鯤鵬晶片越來越好。