• docker对网络和程序速度的影响


    前言

    程序即可以部署在容器内,也可以部署在docker容器中,那么两者有什么区别?部署在容器中相对于直接部署在宿主机上,网络速度是否会变慢?程序运行是否会慢?

    环境说明

    测试使用的服务器是百度智能云轻量级服务器,2核4G,6M宽带。
    在这里插入图片描述
    系统: centos 7.9
    docker版本: Docker version 20.10.13, build a224086
    springboot版本: 2.7.3
    JDK版本: 均为JDK8 (大版本相同避免了JDK大升级对程序运行产生较大影响,也是为了尽量公平)

    网络延迟测试

    两个标签窗口,上图直接使用宿主机进行ping 命令,下图docker的容器内进行ping命令,同时ping同一个ip地址。
    在这里插入图片描述
    根据多次ping命令的观察,可以发现在docker容器内进行ping命令速度比宿主机内慢0.1~0.2 ms。
    结论:docker 对网络的影响很小,大约比主机慢0.1~0.2毫秒。

    程序速度测试

    程序运行速度的是,我们使用springboot 的web方式测试,代码是生成一个倒序的数组,例如5,4,3,2,1
    ,通过冒泡排序算法对数组排序(从小到大),得出排序所消耗的时间。

    注意: 这里不使用随机算法产生数组作为待排序样本,是为了保证每次排序的样本数组是完全一样,保证每次测试公平。

    代码如下:

        @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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    将程序打包为jar包,分别直接部署在宿主机和docker容器内。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    为了避免不确定因素,我们需要多次测试,求平均值。
    测试num=100000,将10万个数字进行排序。

    注:为了避免服务器不同时刻,可能cpu负载不一样,测试采用的交替方式,即一次宿主机,一次docker,降低可能存在的不同时刻主机负载的问题。

    编号宿主机模式(ms)docker模式(ms)
    145904869
    245854647
    347924750
    451164615
    550875087
    650635372
    749785120
    855165098
    951255076
    1053465331
    平均耗时50125002

    平均值计算:去掉一个最大,去掉一个最小,求平均数。

    总结:
    宿主机和 docker容器运行程序的两种方式,宿主机并没有优势,docker容器运行的方式会尽可能争取主机的资源,虽然从平均值看,docker运行的模式比宿主机直接运行还快一点,但是从单次比较,宿主机最快的一次运行4590毫秒,而docker最快的一次是4647毫秒,这又反向说明docker模式的并不一定比主机模式快,所以docker的平均运行比宿主机快属于运行误差,不能佐证docker在速度上优于主机。
    所以主机运行模式和docker容器模式在程序运行效率上没有明显的差异。

    关于网上的结论

    在做这个测试之前,网上的结论是物理机比docker快很多,或者快百分之多少,但是似乎都是以听说的方式得到的结论。这里试验的目的为了以实际数据来得出结论,而不是靠猜测或者听别人说。也非常希望有人以实际的试验结论进行辩驳,欢迎用事实依据的方法纠正。
    上述试验仅供参考。

  • 相关阅读:
    STM32串口发送接收完结
    swift-类属性-MachO读取
    文心一言:文心大模型 4.0 即将发布
    单例模式实现及防止反射与序列化
    第51节:cesium 范围查询(含源码+视频)
    图论27(Leetcode721账户合并)
    数据丢失防护工具
    99%健身人士的疑问:营养补充窗口真的很重要吗?
    matlab串口读写
    直面货到人拣选未来,极智嘉PopPick方案成就行业发展新抓手
  • 原文地址:https://blog.csdn.net/u011628753/article/details/126640186