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

背景

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

基本環境

最基本的試用套餐中,包括一臺1核、1G內存、1M帶寬的彈性服務器;一個100G的雲硬盤還有一個動態的公網IP。我的用戶能夠免費試用15天。
html

服務器可選多種操做系統,華爲推薦的是自有的歐拉操做系統(EulerOS)。這是華爲基於CentOS定製的版本,包含了多種服務器場景的優化,對於ARM64芯片也有更好的支持。其它還有10餘種選擇,都是Linux類的各類發行版本。
嚴重依賴Windows系列的話...你如今能夠退散了,除了Windows操做系統當前還綁定在X86系列CPU之上,微軟系列也屬禁售之列。
做爲試用,首先要「玩」起來方便,我選擇了Ubuntu18.04系統。
前端

跟常見的雲端系統同樣,購買完成,服務器會快速的本身完成配置、啓動。華爲雲提供了基於瀏覽器的終端界面: vue

一開始只有一個root,利用瀏覽器的終端,新建一個平常使用的帳號,升級各項更新和補丁,重啓,而後能夠放心安全的在遠程使用ssh登錄了。有一個動態公網IP,仍是方便不少。
整個過程流暢、穩定,第一印象跟一般使用的服務器並無什麼不一樣。若是不使用uname檢查內核,徹底感受不到是一臺ARM服務器。node

$ 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:python

$ 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

接着是內存:mysql

$ 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:linux

$ 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:nginx

$ 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:

內存:git

$ 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
$ 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":"andrewwang@sina.com","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服務器和鯤鵬芯片愈來愈好。

相關文章
相關標籤/搜索