華為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處修改:
- 在專案根目錄增加
vue.config.js
檔案,配置專案在網站中的子路徑,畢竟雖然是試用,直接把根目錄開放給RealWorld也太不講究了。
- Vue寫的前端,使用了單網頁結構。不同功能之間,看上去是不同的網頁,實際是Vue截獲URL地址,在螢幕元件之間的切換。為了讓Vue路由工作準確,我們需要修改
src/router/index.js
檔案,設定路由模式和基礎網頁檔案URL。
- 前端同後端之間,使用Restful的介面通訊,我們需要在
src/common/config.js
檔案中設定這個API基礎地址。
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%。
考慮到雙方的硬體配置,我主觀覺得算兩家平手說得上公平。
後端開發
首先也是自倉庫下載原始碼。
接著要做這樣幾件事情:
- 後端原來只有一組Restful介面的服務,我們需要讓它能直接提供靜態檔案服務,否則還要另外配置一個靜態檔案服務來容納剛才編譯好的前端檔案。我修改了
src/lib.rs
程式,增加了處理函式,將./static/
資料夾開放為靜態檔案路徑。
- 將Vue前端編譯的結果,是在Vue專案的
dist/
路徑中,完整拷貝到當前專案的static/
目錄。
- 根據程式碼倉庫網頁的說明,配置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伺服器架構,分別是aarch64
和arm64v8
,其中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伺服器和鯤鵬晶片越來越好。