服务器运行状态的监控方法、装置、处理器及服务器与流程

文档序号:17221047发布日期:2019-03-27 11:57阅读:332来源:国知局
服务器运行状态的监控方法、装置、处理器及服务器与流程

本发明涉及计算机领域,具体而言,涉及一种服务器运行状态的监控方法、装置、处理器及服务器。



背景技术:

多进程服务器框架为当下的主流架构。该多进程服务器框架具有多个进程、高并发特点。多个进程之间可以相互进行通信交流,新增进程的扩展实现方式方便,而且其中一个进程异常并不会影响到其他进程的正常运行,因此,服务器架构十分稳定。

服务器在运行期间,实现对内存数据的有效监控是非常必要的。掌握实际运行过程中的内存数据,这些数据的变化对服务器内具体功能的影响,以及在数据反馈下的运行期间异常问题出现之后的调试与服务器本身状态的监控都显得十分重要。

日志记录法是目前常规的服务器内存数据监控手段。日志记录是在服务器运行之前,预先在代码层选定记录位置和需要记录的数据变量名进行代码编写。在服务器运行过程中,当选定记录位置的代码被执行时,需求的数据将会通过日志文件或者服务器运行控制台输出。

然而,日志记录法存在以下技术缺陷:

(1)记录日志的代码可能在服务器运行期间无法得到运行;

(2)无法实时地获取内存数据信息;

(3)能够获取到的数据信息非常有限,局限于代码内按需约定的少量数据。

此外,相关技术中还提供了一种对服务器单个进程进行后台监控的方法。通过服务器的每个进程后台来获取需求的数据信息。

然而,服务器单进程后台监控方式仍然存在以下技术缺陷:

(1)由于需要根据实际需求数据的来源进行定位,因此,获取数据信息需要执行复杂的操作,这需要操作人员对数据来源的层级关系十分清晰,否则将难以应对。

(2)在进程数量过多的情况下,无法确定需求数据是在哪个进程中出现的,这需要在每个进程的后台进行数据获取操作才能够确定数据来源。

除此之外,上述两种方法还存在共性问题:孤立了进程之间的关系,无法达到整体监控内存数据的目的。

针对上述的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明至少部分实施例提供了一种服务器运行状态的监控方法、装置、处理器及服务器,以至少解决相关技术中所提供的在服务器运行期间对内存数据进行监控的解决方案操作复杂度较高、数据缺乏完整性、孤立了进程之间的关系,无法达到整体监控的技术问题。

根据本发明其中一实施例,提供了一种服务器运行状态的监控方法,包括:

在多进程服务器运行期间,获取各个进程对应的内存数据;按照代码结构对获取到的内存数据进行分类处理,得到处理结果;根据处理结果对多进程服务器的运行状态进行监控。

可选地,获取各个进程对应的内存数据包括:获取每个进程所包含的多个模块;获取多个模块中每个模块下的对象信息;确定对象信息中包含的每个对象的种类。

可选地,按照代码结构对获取到的内存数据进行分类处理,得到处理结果包括:将获取到的内存数据划分至对应的归属进程,得到每个进程下的内存数据;按照代码结构对每个进程下的内存数据进行分层处理,得到分层结果,以使获取每个进程下的内存数据的路径与代码结构相对应;根据分层结果确定数据层级,并根据数据层级中的内存数据的数据类型对数据层级中的内存数据进行分类,得到处理结果。

可选地,根据数据层级中的内存数据的数据类型对数据层级中的内存数据进行分类包括:当数据类型为直接数据类型时,将数据层级中的内存数据确定为分层结果的最末层级;当数据类型为非直接数据类型时,对数据层级中的内存数据进行细化处理,直至获取到属于直接数据类型的内存数据,并将直接数据类型的内存数据确定为分层结果的最末层级。

可选地,根据处理结果对多进程服务器的运行状态进行监控包括:通过在多进程服务器中的每个进程上预先配置的通信线程,将处理结果中的一个或多个层级的内存数据展示在与多进程服务器关联的终端上;响应于终端的内存数据修改请求,对处理结果中的内存数据进行修改。

根据本发明其中一实施例,还提供了一种服务器运行状态的监控装置,包括:

获取模块,用于在多进程服务器运行期间,获取各个进程对应的内存数据;处理模块,用于按照代码结构对获取到的内存数据进行分类处理,得到处理结果;监控模块,用于根据处理结果对多进程服务器的运行状态进行监控。

可选地,获取模块包括:第一获取单元,用于获取每个进程所包含的多个模块;第二获取单元,用于获取多个模块中每个模块下的对象信息;确定单元,用于确定对象信息中包含的每个对象的种类。

可选地,处理模块包括:划分单元,用于将获取到的内存数据划分至对应的归属进程,得到每个进程下的内存数据;分层单元,用于按照代码结构对每个进程下的内存数据进行分层处理,得到分层结果,以使获取每个进程下的内存数据的路径与代码结构相对应;处理单元,用于根据分层结果确定数据层级,并根据数据层级中的内存数据的数据类型对数据层级中的内存数据进行分类,得到处理结果。

可选地,处理单元,用于当数据类型为直接数据类型时,将数据层级中的内存数据确定为分层结果的最末层级;当数据类型为非直接数据类型时,对数据层级中的内存数据进行细化处理,直至获取到属于直接数据类型的内存数据,并将直接数据类型的内存数据确定为分层结果的最末层级。

可选地,监控模块包括:展示单元,用于通过在多进程服务器中的每个进程上预先配置的通信线程,将处理结果中的一个或多个层级的内存数据展示在与多进程服务器关联的终端上;调整单元,用于响应于终端的内存数据修改请求,对处理结果中的内存数据进行修改。

根据本发明其中一实施例,还提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述服务器运行状态的监控方法。

根据本发明其中一实施例,还提供了一种处理器,处理器用于运行程序,其中,程序运行时执行上述服务器运行状态的监控方法。

根据本发明其中一实施例,还提供了一种服务器,包括:一个或多个处理器,存储器以及一个或多个程序,其中,一个或多个程序被存储在存储器中,并且被配置为由一个或多个处理器执行,一个或多个程序用于执行上述服务器运行状态的监控方法。

在本发明至少部分实施例中,采用在多进程服务器运行期间获取各个进程对应的内存数据的方式,通过按照代码结构对获取到的内存数据进行分类处理得到处理结果,以及根据处理结果对多进程服务器的运行状态进行监控,达到了对多进程架构服务器的内存数据进行全面化、整体化和清晰化监控的目的,从而实现了全面且实时地获取所有进程的内存数据,对内存数据进行结构化和层次化地分析和整理,使得进程之间的联系更加紧密,并且可以实现对内存数据进行更加明确和更加方便地修改,极大地简化了整个监控操作流程的技术效果,进而解决了相关技术中所提供的在服务器运行期间对内存数据进行监控的解决方案操作复杂度较高、数据缺乏完整性、孤立了进程之间的关系,无法达到整体监控的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的服务器运行状态的监控方法的流程图;

图2是根据本发明其中一实施例的服务器运行状态的监控装置的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

首先,在对本申请实施例进行描述的过程中出现的部分名词或术语适用于如下解释:

内存数据是指服务器运行期间存储的临时数据,记录着当前服务器状态下的所有信息。数据种类包括但不限于:各类模块、函数和变量的存储地址,以及变量和各种类型对象的信息。服务器监控的目的主要在于:变量和各种类型对象存储的数据信息的变化。

根据本发明其中一实施例,提供了一种服务器运行状态的监控方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

该方法实施例可以在服务端或者类似的运算装置中执行。以运行在服务端上为例,服务端可以包括一个或多个处理器(处理器可以包括但不限于微处理器(mcu)或可编程逻辑器件(fpga)等的处理装置)和用于存储数据的存储器。可选地,上述服务端还可以包括用于通信功能的传输装置以及输入输出设备。本领域普通技术人员可以理解,上述结构描述仅为示意,其并不对上述服务端的结构造成限定。例如,服务端还可包括比上述结构描述更多或者更少的组件,或者具有上述结构描述不同的配置。

存储器可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本发明实施例中的服务器运行状态的监控方法对应的计算机程序,处理器通过运行存储在存储器内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的服务器运行状态的监控方法。存储器可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至服务端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

传输装置用于经由一个网络接收或者发送数据。上述的网络具体实例可包括服务端的通信供应商提供的无线网络。在一个实例中,传输装置可以是为服务器的每个进程均添加一个基于套接字(socket)通信模块的线程。

通过使用上述服务端可以实时地获取所有进程的内存数据,并对获取到的内存数据按照代码结构的规则进行分类整理,以及配套的数据展示和修改。

在本实施例中提供了一种运行于上述服务端的服务器运行状态的监控方法,图1是根据本发明实施例的服务器运行状态的监控方法的流程图,如图1所示,该方法包括如下步骤:

步骤s12,在多进程服务器运行期间,获取各个进程对应的内存数据;

步骤s14,按照代码结构对获取到的内存数据进行分类处理,得到处理结果;

步骤s16,根据处理结果对多进程服务器的运行状态进行监控。

通过上述步骤,可以采用在多进程服务器运行期间获取各个进程对应的内存数据的方式,通过按照代码结构对获取到的内存数据进行分类处理得到处理结果,以及根据处理结果对多进程服务器的运行状态进行监控,达到了对多进程架构服务器的内存数据进行全面化、整体化和清晰化监控的目的,从而实现了全面且实时地获取所有进程的内存数据,对内存数据进行结构化和层次化地分析和整理,使得进程之间的联系更加紧密,并且可以实现对内存数据进行更加明确和更加方便地修改,极大地简化了整个监控操作流程的技术效果,进而解决了相关技术中所提供的在服务器运行期间对内存数据进行监控的解决方案操作复杂度较高、数据缺乏完整性、孤立了进程之间的关系,无法达到整体监控的技术问题。

可选地,在步骤s12中,获取各个进程对应的内存数据可以包括以下执行步骤:

步骤s121,获取每个进程所包含的多个模块;

步骤s122,获取多个模块中每个模块下的对象信息;

步骤s123,确定对象信息中包含的每个对象的种类。

无论用何种编程语言来实现多进程服务器框架,其运行期间的内存数据都可以在存储空间获取到。数据分类实现的逻辑和算法也是可以实现的。为了便于描述和理解,以下可选实施例中将以python语言作为服务器编程语言为例来详细说明技术方案的具体实施过程。

针对多进程服务器中所有进程的内存数据的获取方式而言,以python编程语言实现的多进程服务器框架,每个进程的内存数据均可以在进程下基于模块(dir)来获取。通过dir方式可以获得该模块下的所有对象信息,包括但不限于:变量、函数、类。然后,再通过对象(type)方式对内存数据的种类进行判断。如果内存数据属于直接数据类型的变量,例如:基本整数类型(int)、字符串类型(str)、字典类型(dict)和列表类型(list),便可以直接作为监控目标。如果内存数据属于类实例对象类型,则需要执行进一步细化处理,以分析出该类对象下的直接数据类型变量。

因此,通过对当前进程下的所有模块进行分析处理,可以得到所有的内存数据信息。而所有模块则可以通过以下方式获得:

importsys

all_module=sys.modules#dict数据结构,{模块名字:模块对象,}。

可选地,在步骤s14中,按照代码结构对获取到的内存数据进行分类处理,得到处理结果可以包括以下执行步骤:

步骤s141,将获取到的内存数据划分至对应的归属进程,得到每个进程下的内存数据;

步骤s142,按照代码结构对每个进程下的内存数据进行分层处理,得到分层结果,以使获取每个进程下的内存数据的路径与代码结构相对应;

步骤s143,根据分层结果确定数据层级,并根据数据层级中的内存数据的数据类型对数据层级中的内存数据进行分类,得到处理结果。

在获取到多进程服务器中所有进程的内存数据之后,首先,将获取到的内存数据按照来源于不同进程进行区分;然后,基于实现的代码结构,根据内存数据的来源进行层次处理,以使内存数据获取路径与代码结构相对应;最后,在数据内容上,根据数据类型进行分类。由此所有进程的内存数据都存在相互联系,而且内存数据的层次结构与代码结构相对应。

针对多进程服务器中所有进程的内存数据的分类方式而言,分类方式按照从整体到局部的顺序进行,其可以分为以下多个层级:

(1)服务器层级,直接对应具体的服务器。

(2)服务器进程层级,对应多进程服务器框架下的各个进程。

(3)模块路径层级,所有模块都可以通过其_file_属性获取到相应的路径,然后再根据路径进行层级划分。上下级信息基于实际的代码结构进行分层。

(4)数据层级,在确定内存数据属于具体模块之后,可以对模块的_dict_属性进行分类分析。

(5)特殊层级,是针对特殊模块进行特别处理后分类得到的,这些模块也是可以按照常规的方法进行分层。例如:全数据类模块通常只包含存储数据的变量类型,而不会包含函数、类或者其他子模块。因此,可以无需进行分层分析,而是直接通过明文代码展示的方式来特别处理。即,对于全数据类模块而言,可以直接利用inspect模块的getsource接口功能直接获取到具体的明文代码。

可选地,在步骤s143中,根据数据层级中的内存数据的数据类型对数据层级中的内存数据进行分类可以包括以下执行步骤:

步骤s1431,当数据类型为直接数据类型时,将数据层级中的内存数据确定为分层结果的最末层级;

步骤s1432,当数据类型为非直接数据类型时,对数据层级中的内存数据进行细化处理,直至获取到属于直接数据类型的内存数据,并将直接数据类型的内存数据确定为分层结果的最末层级。

如果内存数据属于直接数据类型的变量,例如:int、str、dict和list,考虑到直接数据类型的变化即为服务器内存数据的最直接监控目标,这些内存数据的取值直接代表当前服务器的运行状态信息,也是数据层级的最底层,则将此类内存数据直接作为最末层级进行展示。如果是类实例,考虑到类实例通常包含有直接数据类型、函数或其他类型数据,则对类的_dict_属性进一步进行,其结构与模块的分析方式类似。

可选地,在步骤s16中,根据处理结果对多进程服务器的运行状态进行监控可以包括以下执行步骤:

步骤s161,通过在多进程服务器中的每个进程上预先配置的通信线程,将处理结果中的一个或多个层级的内存数据展示在与多进程服务器关联的终端上;

步骤s162,响应于终端的内存数据修改请求,对处理结果中的内存数据进行修改。

对于从外部控制服务器进程的内存数据的方式,可以为服务器的每个进程均添加一个基于socket通信模块的线程,该线程主要实现以下基本功能:

(1)socket服务端基本功能,socket是基础模块,其基础功能是透明和现成的;

(2)当前内存数据获取的接口函数,该函数用于获取当前时刻下的所有内存数据,并可以根据分类层次参数获取当前层次下的数据信息。

(3)内存数据修改接口函数,该函数用于实现对特定内存数据的修改。

通过socket客户端实现与服务器进程内的socket服务端线程的连接,由此可以达到获取和修改内存数据的目的。

对于服务器进程的内存数据的展示方式而言,可以采用多种表现形式。在一个可选实施例中,以网页形式展示为例,对展示方式进行说明:

(1)通过网页后端的数据获取功能,以socket通信形式获取服务器进程的内存数据;

(2)网页前端直接将获取到的内存数据按照分层结构进行展示。考虑到数据量可能非常庞大,因此,网页后端在向网页前端发送数据时,需要获取当前层次下的所有内存数据信息。

(3)在通过网页对内存数据进行操作的过程中,需要将待操作的数据对象信息,其包括但不限于:数据位置和调整值等,传送至网页后端,再通过上述内存数据修改接口函数来达到对该内存数据进行修改的目的。

由此可见,在对内存数据进行层次化处理之后,当需要获取或修改特定内存数据时,可以极为准确和方便地定位到该特定内存数据并完成对特定内存数据的修改。这样,可以通过网页形式将特定结构层内的数据信息进行展示,并可以进行上下结构层的跳转从而获取对应的信息。

综合上述分析,可以发现本发明实施例所提供的技术方案可以达到如下技术效果:

(1)可以实时地获取到多进程服务器中所有进程的内存数据,以使内存数据监控能够全面和整体地进行,并且通过代码的实现结构可以非常准确和快速第实现内存数据定位,进而完成读取操作与修改操作。

(2)内存数据可以通过网页形式展现,以便用户能够直接通过网页操作达到数据读取与修改的目的,整体流程一目了然。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

在本实施例中还提供了一种服务器运行状态的监控装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。

图2是根据本发明其中一实施例的服务器运行状态的监控装置的结构框图,如图2所示,该装置包括:获取模块10,用于在多进程服务器运行期间,获取各个进程对应的内存数据;处理模块20,用于按照代码结构对获取到的内存数据进行分类处理,得到处理结果;监控模块30,用于根据处理结果对多进程服务器的运行状态进行监控。

可选地,获取模块10包括:第一获取单元(图中未示出),用于获取每个进程所包含的多个模块;第二获取单元(图中未示出),用于获取多个模块中每个模块下的对象信息;确定单元(图中未示出),用于确定对象信息中包含的每个对象的种类。

可选地,处理模块20包括:划分单元(图中未示出),用于将获取到的内存数据划分至对应的归属进程,得到每个进程下的内存数据;分层单元(图中未示出),用于按照代码结构对每个进程下的内存数据进行分层处理,得到分层结果,以使获取每个进程下的内存数据的路径与代码结构相对应;处理单元(图中未示出),用于根据分层结果确定数据层级,并根据数据层级中的内存数据的数据类型对数据层级中的内存数据进行分类,得到处理结果。

可选地,处理单元(图中未示出),用于当数据类型为直接数据类型时,将数据层级中的内存数据确定为分层结果的最末层级;当数据类型为非直接数据类型时,对数据层级中的内存数据进行细化处理,直至获取到属于直接数据类型的内存数据,并将直接数据类型的内存数据确定为分层结果的最末层级。

可选地,监控模块30包括:展示单元(图中未示出),用于通过在多进程服务器中的每个进程上预先配置的通信线程,将处理结果中的一个或多个层级的内存数据展示在与多进程服务器关联的终端上;调整单元(图中未示出),用于响应于终端的内存数据修改请求,对处理结果中的内存数据进行修改。

需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。

本发明的实施例还提供了一种存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

s1,在多进程服务器运行期间,获取各个进程对应的内存数据;

s2,按照代码结构对获取到的内存数据进行分类处理,得到处理结果;

s3,根据处理结果对多进程服务器的运行状态进行监控。

可选地,在本实施例中,上述存储介质可以包括但不限于:u盘、只读存储器(read-onlymemory,简称为rom)、随机存取存储器(randomaccessmemory,简称为ram)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。

本发明的实施例还提供了一种处理器,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。

可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:

s1,在多进程服务器运行期间,获取各个进程对应的内存数据;

s2,按照代码结构对获取到的内存数据进行分类处理,得到处理结果;

s3,根据处理结果对多进程服务器的运行状态进行监控。

可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1