CN110795092B - Docker执行Epoll系统调用的方法 - Google Patents

Docker执行Epoll系统调用的方法 Download PDF

Info

Publication number
CN110795092B
CN110795092B CN201810863582.4A CN201810863582A CN110795092B CN 110795092 B CN110795092 B CN 110795092B CN 201810863582 A CN201810863582 A CN 201810863582A CN 110795092 B CN110795092 B CN 110795092B
Authority
CN
China
Prior art keywords
event
epoll
docker
system call
golang
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201810863582.4A
Other languages
English (en)
Other versions
CN110795092A (zh
Inventor
孟杰
薛皓琳
卢彦
张蓓
刘莉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China Standard Software Co Ltd
Original Assignee
China Standard Software Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by China Standard Software Co Ltd filed Critical China Standard Software Co Ltd
Priority to CN201810863582.4A priority Critical patent/CN110795092B/zh
Publication of CN110795092A publication Critical patent/CN110795092A/zh
Application granted granted Critical
Publication of CN110795092B publication Critical patent/CN110795092B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

发明涉及一种Docker执行Epoll系统调用的方法及其用途,所述方法包括:创建一个Epoll实例,返回该实例的文件描述符;注册需要的特定文件描述符;等待注册事件发生;在监测到某个事件发生后,检测在事件发生的过程中是否有报错;检测该事件的性质,如果是OOM事件,则进入OOM事件处理流程,如果是常规事件,则进行下一步操作;判断该事件是否是EPOLLHUP事件,若不是,则结束,若是,则进行下一步操作;将该EPOLLHUP事件从相应的文件描述符所对应的事件列表中删除,删除失败则报错。本发明克服了现有Docker容器执行退出速度慢的缺陷,提高了Docker容器的响应速度。

Description

Docker执行Epoll系统调用的方法
技术领域
本发明涉及计算机软件优化技术领域,具体涉及一种Docker执行Epoll系统调用的方法及其用途。
背景技术
随着互联网技术的不断发展,互联网应用出现在人们生活的方方面面,这些应用的后台服务无时无刻都承受着巨大的压力,大量的用户请求涌向后台服务器时,将会给服务器造成巨大的压力。这就对服务器的性能有着很高的要求,使用性能更高的服务器或者增加服务器的数量这种直观的方式固然很简单,但是会带来额外的开销,造成成本的迅速增加。因此,如何使用有限的资源做更多的事情是一直以来的焦点。
近年来,随着容器技术的发展,Docker容器进入了大众的视野。Docker容器可以把一个服务打包封装成一个镜像,实现容器的快速部署,可以在同一台机器上运行一个镜像的多个实例,也可以在多台机器上运行同一个镜像的实例,进而实现容器的集群化,这对容器本身的启动和退出速度有一定的要求。当大量容器运行在一个集群节点上时,对这些容器的管理就非常重要,容器的启动、运行和退出速度将影响到整个集群的运行效率。
Docker容器由go语言编写,对镜像和容器的管理都离不开go。国外如Google、AWS、Cloudflare、CoreOS等,国内如阿里等都已经开始大规模使用Golang开发其云计算相关产品,可见go在云领域已经占据极其重要的地位。
由于Docker容器的广泛的应用,大量的嵌入式系统增加了对容器的支持。对于一个嵌入式系统而言,如何使用有限的资源做到更多的事情是永恒不变的话题,在这些嵌入式系统中,如何使Docker容器更加高效的运行是一个重要的课题。
Docker容器由go语言编写,go语言可以避免大部分C风格include文件与库的开头。且go语言是静态类型的语言,它的类型系统没有层级,因此在理论上,用户不需要在定义类型之间的关系上花费时间,使用起来go语言比典型的面向对象语言更轻量级。但是,正是由于程序员不需要在定义类型上花费时间,这将会直接导致Docker容器在某些架构下功能的不可用。
当容器在退出,或是使用Docker容器 kill/stop命令使容器退出时,会触发一系列进程的响应,如图1所示,为现有的Docker容器执行退出流程图,如图1所示,以Docker-1.12.x的容器执行退出为例,现有的Docker容器执行退出流程大致包括下述步骤:
一、Docker守护进程(Docker deamon)接收到Docker用户进程(Docker Client)发送的退出、停止或杀死命令时,将发送一个stop信号给容器管理进程,并开始等待进程返回的退出码。
二、(Docker容器)Docker-containerd收到Docker守护进程发送的stop信号,Docker-containerd将这个指令发送给真正管理这个容器的进程Docker-containerd-shim(Docker容器运行载体),并使用Docker-containerd中之前创建好的一个Monitor(监控器)对Docker-containerd-shim进行监控。
三、Docker-containerd-shim在收到信号后,开始回收调用进程的所有子进程并返回它们的退出信息,检查进程是否全部退出,检查容器是否真正退出后,Docker-containerd-shim最后退出。
四、Docker-containerd在监控到Docker-containerd-shim退出后,开始对这个退出事件进行处理。获取事件后,对事件数据进行提取,如果是EPOLLHUP的事件,把事件的相关文件描述符关闭,把收到事件的也删除,待处理的事件全部处理完成后,监控器退出,并告知Docker容器守护进程,容器已关闭。
五、Docker容器守护进程监听IO操作,发现容器已关闭,此时修改容器状态,守护进程才将用户进程最终关闭。
目前,在64位嵌入式系统中,第四步不使用go提供的各种系统调用实现事件的监控,其普遍使用的一种方式就是间接的对Epoll进行调用,就是使用c语言对Epoll系统调用进行进一步封装,然后使用go在以上监控器的执行流程中对再封装的Epoll进行调用。如不使用上述方案,则在64位嵌入式系统中,Docker容器将会有功能上的缺陷,使用这样的方案,则会对Docker容器带来效率上的降低。
因此,有必要提供一种更高效的Epoll系统调用方法。
发明内容
为解决现有技术存在的不足,本发明提供了一种Docker执行Epoll系统调用的方法,包括如下步骤:
步骤S1:通过Docker后台进程创建一个Epoll实例,返回该实例的文件描述符;
步骤S2:通过Docker后台进程注册需要的特定文件描述符;
步骤S3:直接调用Epoll_Wait等待注册事件发生;
步骤S4:在监测到某个事件发生后,检测在事件发生的过程中是否有报错,如果没有报错,则进入下一步的事件处理流程;
步骤S5:检测该事件的性质,如果是OOM事件,则进入OOM事件处理流程,如果是常规事件,则进行下一步操作;
步骤S6:判断该事件是否是EPOLLHUP事件,若不是,则结束,若是,则进行下一步操作;
步骤S7:使用golang将该EPOLLHUP事件从相应的文件描述符所对应的事件列表中删除,删除失败则报错。
其中,所述步骤S1中,通过golang的系统调用Epoll_Createl创建一个Epoll实例。
其中,所述步骤S2中,通过golang的系统调用Epoll_Ctl注册需要的特定文件描述符。
其中,所述步骤S3中,通过golang的系统调用Epoll_Wait等待注册事件的发生。
其中,所述步骤S7中,通过golang的系统调用Epoll_Ctl将EPOLLHUP事件从相应的文件描述符所对应的事件列表中删除。
其中,在Docker执行Epoll系统调用之前,还通过对golang的Epoll的EpollEvent进行修改以保证golang的Epoll能够在嵌入系统中正常运行。
其中,对EpollEvent进行修改的结构体为:
type EpollEvent struct {
     Events     uint32
     Fd         int32
     Pad        int32
}。
其中,对该结构体的修改包括:对该结构体的Fd类型进行调整,加入对系统架构的判断。
其中,所调整的结构体的Fd类型为int64。
其中,该方法用于64位嵌入式系统的调用。
本发明提供的Docker执行Epoll系统调用的方法及其用途,克服了现有Docker容器执行退出速度慢的缺陷,提高了Docker容器的响应速度。
附图说明
图1:现有的Docker容器执行退出流程图。
图2:本发明的Docker执行Epoll系统调用的方法流程图。
具体实施方式
为了对本发明的技术方案及有益效果有更进一步的了解,下面结合附图详细说明本发明的技术方案及其产生的有益效果。
本发明的目的在于,针对现有的Docker在执行Epoll系统调用时,响应过慢的问题,提供一种更加高效的调用方式。本发明提供的Docker执行Epoll系统调用的方法,仍然使用直接调用Epoll的方式。
图2为本发明的Docker执行Epoll系统调用的方法的流程图,如图2所示,本发明在Docker执行系统调用时,首先通过go提供的系统调用Epoll_Create1创建一个epoll实例,返回该实例的文件描述符,再通过go提供的系统调用Epoll_Ctl注册需要的特定文件描述符,这部分是在创建监视器的过程中已经确定的。
通过直接调用go提供的系统调用Epoll_Wait等待注册事件发生,在监测到某个事件发生后,检查在这个过程中是否有报错,如果没有报错,则进入事件处理流程;检查是否是常规事件,如果是,则进入常规事件处理流程,如果是OOM事件,则进入OOM处理流程,此处着重点在常规事件处理流程;进入常规事件处理流程后,主要处理EPOLLHUP 事件,首先要使用go提供的系统调用Epoll_Ctl将这个事件从相应文件描述符所对应的事件列表中删除,删除失败则报错;继续下一个事件的处理,至此,进程已接受Epoll事件。
也即,本发明的Docker执行Epoll系统调用的方法,相比较现有技术,减少了两个步骤,现有技术中,在等待注册事件发生之前,都需要使用动态连接器进行地址重定位,然而,只要有函数的调用,就会有压栈和出栈方面的开销,所执行的机器指令就会从一条变成几十条。而在本发明中,以上所涉及到的go提供的系统在调用Epoll_Create1和Epoll_Wait中均不需要进行再封装,均减少了两个步骤,直接对系统调用进行调用。
本发明主要通过优化修改golang实现上述效果,使得golang的Epoll可以在64位嵌入式系统中正常运行,在64位嵌入式系统中的Docker不需要额外的对Epoll进行再封装,可以直接使用Epoll。原则上是对语言的修改尽量做到少的改动,达到最大的效果。这个修改主要对EpollEvent进行
type EpollEvent struct {
     Events     uint32
     Fd         int32
     Pad        int32
}。
本发明对这个结构体中的Fd的类型进行调整,加入对系统架构的判断,当针对的系统是64位嵌入式系统时,则Fd为int64。
在大量的容器运行时,使用系统调用再封装的方式就会对系统造成负担,首先就是大量容器造成的系统压栈和出栈的开销会快速增长,这些容器所需要执行的指令数量也急剧增加,尤其是在容器集群中,这些容器都需要使用对应的接口时,多余的指令只能造成效率的降低;其次,这样间接的调用会造成动态连接器的负担的增加。在Docker中,不只有退出会使用到Epoll,还有其他功能还会用到这个接口。
Golang在网络编程方面有很强的优势,所以除Docker以外还有很多软件需要用到这个Epoll接口,Epoll在速度和并发量上有着很明显的优势,不会因为socket的增加而降低效率。正因如此,在golang中,不应该让这些间接调用的方式消耗掉Epoll带来的效率从而抵消golang本身的优势。在64位嵌入式系统中,这样的修改方式既可以保证不会损耗Epoll的速度和并发量的优势,也解决了Docker容器的功能缺陷,是个两全其美的方式。
本发明中,所谓的“Epoll”,是指IO多路复用技术,是select/poll的增强版,多用于大数据、高并发的网络编程情景中。Epoll接口一共提供三个函数,Epoll_Create,Epoll_Ctl、Epoll_Wait。其中,
Epoll_Create用于创建一个epoll句柄,为这个对象分配资源。
Epoll_Ctl是epoll事件注册函数,把要监听的事件注册到内核中。
Epoll_Wait等待所注册的事件发生。
本发明中,所谓的“EpollEvent”,是指Epoll事件在对应的结构体。
本发明中,所谓的“EPOLLHUP”,是指对应的文件描述符被挂断事件。
本发明中,所谓的“OOM”,为out of memory的缩写,表示内存即将耗尽,在系统资源即将耗尽的情况下,必须对资源进行回收,否则系统即将崩溃。
本发明中,所谓的“golang”, 又称go语言,是一款开源编程语言。
本发明的有益效果如下:
1.通过对Docker进行优化,有效且巧妙的解决了Docker在64位嵌入式系统中的功能缺陷,并通过减少调用开销,精简调用过程,降低了所执行的指令的数量,从而提升了Docker容器的执行效率和Docker容器的响应速度,使得在进行Docker容器集群化管理时可以更加快速。
2.通过对golang进行改动,在64位嵌入式系统中,其他软件使用golang进行网络编程且利用Epoll_Create1、Epoll_Wait接口和EpollEvent结构体时,可以获取正确的数据,保证程序的正确性。
虽然本发明已利用上述较佳实施例进行说明,然其并非用以限定本发明的保护范围,任何本领域技术人员在不脱离本发明的精神和范围之内,相对上述实施例进行各种变动与修改仍属本发明所保护的范围,因此本发明的保护范围以权利要求书所界定的为准。

Claims (6)

1.一种Docker执行Epoll系统调用的方法,其特征在于,包括如下步骤:
步骤S1:通过Docker后台进程创建一个Epoll实例,返回该实例的文件描述符;
步骤S2:通过Docker后台进程注册需要的特定文件描述符;
步骤S3:直接调用Epoll_wait等待注册事件发生;
步骤S4:在监测到某个事件发生后,检测在事件发生的过程中是否有报错,如果没有报错,则进入下一步的事件处理流程;
步骤S5:检测该事件的性质,如果是OOM事件,则进入OOM事件处理流程,如果是常规事件,则进行下一步操作;
步骤S6:判断该事件是否是EPOLLHUP事件,若不是,则结束,若是,则进行下一步操作;
步骤S7:使用golang将该EPOLLHUP事件从相应的文件描述符所对应的事件列表中删除,删除失败则报错;
所述步骤S1中,通过golang的系统调用Epoll_Createl创建一个Epoll实例;
在Docker执行Epoll系统调用之前,还通过对golang的Epoll的EpollEvent进行修改以保证golang的Epoll能够在嵌入式系统中正常运行;
对EpollEvent进行修改的结构体为:
Figure FDA0004133525020000011
Figure FDA0004133525020000021
对该结构体的修改包括:对该结构体的Fd类型进行调整,加入对系统架构的判断。
2.如权利要求1所述的Docker执行Epoll系统调用的方法,其特征在于:所述步骤S2中,通过golang的系统调用Epoll_Ctl注册需要的特定文件描述符。
3.如权利要求1所述的Docker执行Epoll系统调用的方法,其特征在于:所述步骤S3中,通过golang的系统调用Epoll_Wait等待注册事件的发生。
4.如权利要求1所述的Docker执行Epoll系统调用的方法,其特征在于:所述步骤S7中,通过golang的系统调用Epoll_Ctl将EPOLLHUP事件从相应的文件描述符所对应的事件列表中删除。
5.如权利要求1所述的Docker执行Epoll系统调用的方法,其特征在于:所调整的结构体的Fd类型为int64。
6.如权利要求1-5中任一项所述的Docker执行Epoll系统调用的方法,其特征在于:该方法用于64位嵌入系统式的调用。
CN201810863582.4A 2018-08-01 2018-08-01 Docker执行Epoll系统调用的方法 Active CN110795092B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810863582.4A CN110795092B (zh) 2018-08-01 2018-08-01 Docker执行Epoll系统调用的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810863582.4A CN110795092B (zh) 2018-08-01 2018-08-01 Docker执行Epoll系统调用的方法

Publications (2)

Publication Number Publication Date
CN110795092A CN110795092A (zh) 2020-02-14
CN110795092B true CN110795092B (zh) 2023-05-02

Family

ID=69425392

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810863582.4A Active CN110795092B (zh) 2018-08-01 2018-08-01 Docker执行Epoll系统调用的方法

Country Status (1)

Country Link
CN (1) CN110795092B (zh)

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103164256A (zh) * 2011-12-08 2013-06-19 深圳市快播科技有限公司 一种实现单机支持高并发处理方法及系统
CN106302554A (zh) * 2016-11-08 2017-01-04 郑州云海信息技术有限公司 一种socket通信方法、装置和存储设备
CN106534118A (zh) * 2016-11-11 2017-03-22 济南浪潮高新科技投资发展有限公司 一种高性能ip‑sm‑gw系统的实现方法
CN107479955A (zh) * 2017-08-04 2017-12-15 南京华飞数据技术有限公司 一种基于Epoll异步服务器的高效响应方法
CN108228330A (zh) * 2018-02-06 2018-06-29 北京安博通科技股份有限公司 一种串行化的多进程任务调度方法和装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9384071B2 (en) * 2011-03-31 2016-07-05 Solarflare Communications, Inc. Epoll optimisations
US9778963B2 (en) * 2014-03-31 2017-10-03 Solarflare Communications, Inc. Ordered event notification

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103164256A (zh) * 2011-12-08 2013-06-19 深圳市快播科技有限公司 一种实现单机支持高并发处理方法及系统
CN106302554A (zh) * 2016-11-08 2017-01-04 郑州云海信息技术有限公司 一种socket通信方法、装置和存储设备
CN106534118A (zh) * 2016-11-11 2017-03-22 济南浪潮高新科技投资发展有限公司 一种高性能ip‑sm‑gw系统的实现方法
CN107479955A (zh) * 2017-08-04 2017-12-15 南京华飞数据技术有限公司 一种基于Epoll异步服务器的高效响应方法
CN108228330A (zh) * 2018-02-06 2018-06-29 北京安博通科技股份有限公司 一种串行化的多进程任务调度方法和装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
何金龙 ; 高文华 ; 王馨 ; .LINUX下大规模TCP连接应用编程模型设计.广东通信技术.2011,(05),全文. *
张轶凡 ; 卢正兴 ; 王芙蓉 ; .Linux下高性能网络I/O解决方案分析.现代计算机.2006,(11),全文. *

Also Published As

Publication number Publication date
CN110795092A (zh) 2020-02-14

Similar Documents

Publication Publication Date Title
US11829742B2 (en) Container-based server environments
US11093270B2 (en) Fast-booting application image
US11544137B2 (en) Data processing platform monitoring
JP5961173B2 (ja) ステートレスクラウドコンピューティング環境において動作するステートフルアプリケーション
US10346148B2 (en) Per request computer system instances
US7171663B2 (en) External event interrupt for server-side programs
US20070016893A1 (en) Tracking resource usage by applications
US9218401B2 (en) Systems and methods for remote access to DB2 databases
US20160269479A1 (en) Cloud virtual server scheduling method and apparatus
US11831410B2 (en) Intelligent serverless function scaling
CN107025135B (zh) Docker容器内应用进程管理方法、装置和介质
US11321090B2 (en) Serializing and/or deserializing programs with serializable state
CN115373835A (zh) Flink集群的任务资源调整方法、装置及电子设备
WO2023124543A1 (zh) 用于大数据的数据处理方法和数据处理装置
CN114398179B (zh) 一种跟踪标识的获取方法、装置、服务器及存储介质
US10726047B2 (en) Early thread return with secondary event writes
EP3387532A1 (en) Tail of logs in persistent main memory
CN110795092B (zh) Docker执行Epoll系统调用的方法
US20230205576A1 (en) Instruction offload to processor cores in attached memory
US20200218557A1 (en) Event-based virtual machine that hosts microservices
CN113326098B (zh) 支持kvm虚拟化与容器虚拟化的云管平台
CN107463438B (zh) 用于多Openstack环境的信息处理方法、装置和系统
Kukreti et al. CloneHadoop: Process Cloning to Reduce Hadoop's Long Tail
US11972242B2 (en) Runtime environment optimizer for JVM-style languages
CN111190693B (zh) 一种基于鲲鹏平台搭建云平台的方法及装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant