docker對網(wǎng)絡(luò)和程序速度的影響解讀
前言
程序即可以部署在容器內(nèi),也可以部署在docker容器中,那么兩者有什么區(qū)別?
部署在容器中相對于直接部署在宿主機上,網(wǎng)絡(luò)速度是否會變慢?程序運行是否會慢?
環(huán)境說明
測試使用的服務(wù)器是百度智能云輕量級服務(wù)器,2核4G,6M寬帶。
- 系統(tǒng): centos 7.9
- docker版本: Docker version 20.10.13, build a224086
- springboot版本: 2.7.3
- JDK版本: 均為JDK8 (大版本相同避免了JDK大升級對程序運行產(chǎn)生較大影響,也是為了盡量公平)
網(wǎng)絡(luò)延遲測試
兩個標(biāo)簽窗口,上圖直接使用宿主機進行ping 命令,下圖docker的容器內(nèi)進行ping命令,同時ping同一個ip地址。
根據(jù)多次ping命令的觀察,可以發(fā)現(xiàn)在docker容器內(nèi)進行ping命令速度比宿主機內(nèi)慢0.1~0.2 ms。
結(jié)論:docker 對網(wǎng)絡(luò)的影響很小,大約比主機慢0.1~0.2毫秒。
程序速度測試
程序運行速度的是,我們使用springboot 的web方式測試,代碼是生成一個倒序的數(shù)組,例如5,4,3,2,1,通過冒泡排序算法對數(shù)組排序(從小到大),得出排序所消耗的時間。
注意:
這里不使用隨機算法產(chǎn)生數(shù)組作為待排序樣本,是為了保證每次排序的樣本數(shù)組是完全一樣,保證每次測試公平。
代碼如下:
@GetMapping("/test/{num}") public String test(@PathVariable("num") int num){ long s=System.currentTimeMillis(); int[] arr=new int[num]; for(int i=num;i>0;i--){ arr[num-i]=i; } //System.out.println(Arrays.toString(arr)); BubbleSortMethod(arr);//冒泡排序 // System.out.println(Arrays.toString(arr)); long e=System.currentTimeMillis(); return "排序:"+num+",耗時:"+(e-s)+" ms"; } public static int[] BubbleSortMethod(int[] arr){ int temp = 0; for (int i = 0; i < arr.length-1; i++) { for (int j = 0; j < arr.length-1 -i; j++) { if (arr[j] > arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } return arr; }
將程序打包為jar包,分別直接部署在宿主機和docker容器內(nèi)。
為了避免不確定因素,我們需要多次測試,求平均值。
測試num=100000,將10萬個數(shù)字進行排序。
注:
為了避免服務(wù)器不同時刻,可能cpu負(fù)載不一樣,測試采用的交替方式,即一次宿主機,一次docker,降低可能存在的不同時刻主機負(fù)載的問題。
編號 | 宿主機模式(ms) | docker模式(ms) |
---|---|---|
1 | 4590 | 4869 |
2 | 4585 | 4647 |
3 | 4792 | 4750 |
4 | 5116 | 4615 |
5 | 5087 | 5087 |
6 | 5063 | 5372 |
7 | 4978 | 5120 |
8 | 5516 | 5098 |
9 | 5125 | 5076 |
10 | 5346 | 5331 |
平均耗時 | 5012 | 5002 |
平均值計算:去掉一個最大,去掉一個最小,求平均數(shù)。
總結(jié):
- 宿主機和 docker容器運行程序的兩種方式,宿主機并沒有優(yōu)勢,docker容器運行的方式會盡可能爭取主機的資源,雖然從平均值看,docker運行的模式比宿主機直接運行還快一點,但是從單次比較,宿主機最快的一次運行4590毫秒,而docker最快的一次是4647毫秒,這又反向說明docker模式的并不一定比主機模式快,所以docker的平均運行比宿主機快屬于運行誤差,不能佐證docker在速度上優(yōu)于主機。
- 所以主機運行模式和docker容器模式在程序運行效率上沒有明顯的差異。
關(guān)于網(wǎng)上的結(jié)論
在做這個測試之前,網(wǎng)上的結(jié)論是物理機比docker快很多,或者快百分之多少,但是似乎都是以聽說的方式得到的結(jié)論。這里試驗的目的為了以實際數(shù)據(jù)來得出結(jié)論,而不是靠猜測或者聽別人說。也非常希望有人以
實際的試驗結(jié)論進行辯駁,歡迎用事實依據(jù)的方法糾正。
上述試驗僅供參考。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談關(guān)于Docker容器互聯(lián)的初步實踐
這篇文章主要介紹了淺談關(guān)于Docker容器互聯(lián)的初步實踐,本文介紹了使用網(wǎng)橋(bridge)來對容器進行互聯(lián),非常具有實用價值,需要的朋友可以參考下2018-10-10docker compose方式如何安裝ClickHouse數(shù)據(jù)庫
這篇文章主要介紹了docker compose方式如何安裝ClickHouse數(shù)據(jù)庫問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04