docker對網(wǎng)絡(luò)和程序速度的影響解讀
前言
程序即可以部署在容器內(nèi),也可以部署在docker容器中,那么兩者有什么區(qū)別?
部署在容器中相對于直接部署在宿主機(jī)上,網(wǎng)絡(luò)速度是否會變慢?程序運(yùn)行是否會慢?
環(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大升級對程序運(yùn)行產(chǎn)生較大影響,也是為了盡量公平)
網(wǎng)絡(luò)延遲測試
兩個標(biāo)簽窗口,上圖直接使用宿主機(jī)進(jìn)行ping 命令,下圖docker的容器內(nèi)進(jìn)行ping命令,同時ping同一個ip地址。
根據(jù)多次ping命令的觀察,可以發(fā)現(xiàn)在docker容器內(nèi)進(jìn)行ping命令速度比宿主機(jī)內(nèi)慢0.1~0.2 ms。
結(jié)論:docker 對網(wǎng)絡(luò)的影響很小,大約比主機(jī)慢0.1~0.2毫秒。
程序速度測試
程序運(yùn)行速度的是,我們使用springboot 的web方式測試,代碼是生成一個倒序的數(shù)組,例如5,4,3,2,1,通過冒泡排序算法對數(shù)組排序(從小到大),得出排序所消耗的時間。
注意:
這里不使用隨機(jī)算法產(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包,分別直接部署在宿主機(jī)和docker容器內(nèi)。
為了避免不確定因素,我們需要多次測試,求平均值。
測試num=100000,將10萬個數(shù)字進(jìn)行排序。
注:
為了避免服務(wù)器不同時刻,可能cpu負(fù)載不一樣,測試采用的交替方式,即一次宿主機(jī),一次docker,降低可能存在的不同時刻主機(jī)負(fù)載的問題。
編號 | 宿主機(jī)模式(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 |
平均值計(jì)算:去掉一個最大,去掉一個最小,求平均數(shù)。
總結(jié):
- 宿主機(jī)和 docker容器運(yùn)行程序的兩種方式,宿主機(jī)并沒有優(yōu)勢,docker容器運(yùn)行的方式會盡可能爭取主機(jī)的資源,雖然從平均值看,docker運(yùn)行的模式比宿主機(jī)直接運(yùn)行還快一點(diǎn),但是從單次比較,宿主機(jī)最快的一次運(yùn)行4590毫秒,而docker最快的一次是4647毫秒,這又反向說明docker模式的并不一定比主機(jī)模式快,所以docker的平均運(yùn)行比宿主機(jī)快屬于運(yùn)行誤差,不能佐證docker在速度上優(yōu)于主機(jī)。
- 所以主機(jī)運(yùn)行模式和docker容器模式在程序運(yùn)行效率上沒有明顯的差異。
關(guān)于網(wǎng)上的結(jié)論
在做這個測試之前,網(wǎng)上的結(jié)論是物理機(jī)比docker快很多,或者快百分之多少,但是似乎都是以聽說的方式得到的結(jié)論。這里試驗(yàn)的目的為了以實(shí)際數(shù)據(jù)來得出結(jié)論,而不是靠猜測或者聽別人說。也非常希望有人以
實(shí)際的試驗(yàn)結(jié)論進(jìn)行辯駁,歡迎用事實(shí)依據(jù)的方法糾正。
上述試驗(yàn)僅供參考。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談關(guān)于Docker容器互聯(lián)的初步實(shí)踐
這篇文章主要介紹了淺談關(guān)于Docker容器互聯(lián)的初步實(shí)踐,本文介紹了使用網(wǎng)橋(bridge)來對容器進(jìn)行互聯(lián),非常具有實(shí)用價值,需要的朋友可以參考下2018-10-10docker compose方式如何安裝ClickHouse數(shù)據(jù)庫
這篇文章主要介紹了docker compose方式如何安裝ClickHouse數(shù)據(jù)庫問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04