一种性能测试数据收集方法及系统与流程

专利2024-04-11  110



1.本发明涉及集群性能测试技术领域,尤其涉及一种性能测试数据收集方法及系统。


背景技术:

2.随着信息技术的不断发展,服务器等互联网基础设备的应用越来越广泛。在使用服务器的过程中,服务器的正常运行,与服务器部件的性能密切相关。服务器部件的性能测试包括硬盘、raid(redundant arrays of independent disks,磁盘阵列)卡、硬盘背板等部件的性能测试,引入新的硬盘、raid卡、硬盘背板时,均需要进行性能测试。
3.在内网环境实施性能测试时,由于缺乏online实时性能数据收集系统,所以在收集服务端、数据库端、负载机等设备资源数据时,需要重复且精细的记录工作。因实施的监控策略不同,数据收集的难度逐步加大,在实行集群模式的性能测试时,数据收集难度过大,数据复杂,收集易出错是不可避免的问题。
4.因此,如何提高集群性能测试的工作效率,降低测试的成本是本领域技术人员关注的重点问题。


技术实现要素:

5.本发明的目的在于提供一种性能测试数据收集方法及系统,以解决上述技术背景中提出的问题。
6.为实现上述目的,本发明采用以下技术方案:
7.本技术第一个方面提供了一种性能测试数据收集方法,包括:
8.基于python-paramiko库的重新封装,获取多个待监控服务器的资源,其中,所述多个待监控服务器的资源包括:多个ubuntu系统和/或多个linux系统的地址、监控策略、用户名及密码;
9.批量连接多个待监控服务器并部署性能监控工具nmon;
10.根据获取的监控策略,通过性能监控工具nmon执行性能监控命令;
11.提取多个待监控服务器的原始监控文件,使用python解析性能监控工具nmon客户端的excel宏,并在预设的目标目录下自动生成监控解析文件;
12.对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理,并将处理后的数据结果输出至预设的excel文件中。
13.上述内容中,监控策略主要参数有:监控时长、监控间隔、数据记录方式、数据颗粒度、数据存放目录等。
14.参数组合举例如下:nmon[-f|-f文件名|-x|-x|-z][-r《运行名》][-t|-t|-y][-s秒][-c数][-w数][-ldpl][-d][-g文件名][-k disklist][-g][-k][-o输出路径][-d][-e][-j][-v][-p][-m][-n][-w][-s][-^][-o][-l][-i百分比][-a][-m《目录》][-z优先级][-i][-y选项]
[0015]
优选地,所述获取多个待监控服务器的资源,是通过重新封装python-paramiko库实现的,所述python-paramiko库的重新封装,具体包括如下步骤:
[0016]
读取基于批量任务的输入地址、用户名和密码;
[0017]
使用python创建多线程;
[0018]
在线程内使用paramiko库的ssh连接方法,批量建立对应的ssh连接,使paramiko库通过ssh方式批量登录并操作多个ubuntu系统和/或多个linux系统。
[0019]
更优选地,重新封装后得到的python-paramiko库,被配置有如下功能:
[0020]
登录多个ubuntu系统和/或多个linux系统;
[0021]
执行原生ubuntu命令;
[0022]
从服务器向目标机器提供性能监控工具nmon;
[0023]
从目标机器提取监控数据文件;
[0024]
根据监控参数生成监控命令并执行;
[0025]
根据输入的ubuntu命令自动生成shell脚本。
[0026]
优选地,所述使用python解析性能监控工具nmon客户端的excel宏,具体包括如下步骤:
[0027]
使用python-paramiko库的xlrd和os,打开excel文件,查找性能监控工具nmon客户端指定的宏名称,对目标宏进行操作,使其解析原始监控文件,最后输出资源数据的excel文件至指定文件夹。
[0028]
优选地,所述对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理,并将处理后的数据结果输出至预设的excel文件中,是通过使用python封装一个能够批量获取并重新组合excel数据的工具实现的,具体包括如下步骤:
[0029]
重新封装python的openpyxl库,使得该工具具备如下功能:打开excel,提取excel指定位置的数据,创建新的excel文件,在excel内写入数据及公式,对比提取数据得出差值。
[0030]
更优选地,所述对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理,并将处理后的数据结果输出至预设的excel文件中,具体包括如下步骤:
[0031]
根据输入的预设的目标目录,提取该目标目录对应路径下的所有excel文件;
[0032]
根据所述工具内的sheet页及数据位置的参数,依次从每个excel文件中提取出预设的需求数据(例如,io、cpu、mem、network),暂存至内存空间;
[0033]
获得所有数据后,根据监控策略进行差值计算;
[0034]
新建excel文件,将提取出的需求数据及差值数据根据监控策略输出到该新建excel文件的指定sheet页的指定位置;
[0035]
对新建的excel文件进行保存,并输出保存的路径。
[0036]
本技术第二个方面提供了一种性能测试数据收集系统,包括:
[0037]
获取单元,被配置为对原始的paramiko库进行重新封装,使其能获取多个待监控服务器的资源,其中,所述多个待监控服务器的资源包括:多个ubuntu系统和/或多个linux系统的地址、监控策略、用户名及密码;
[0038]
分析单元,被配置为通过性能监控工具nmon对所述待监控服务器资源进行分析,得到多个待监控服务器的原始监控文件;
[0039]
解析单元,被配置为使用python解析性能监控工具nmon客户端的excel宏,并在预设的目标目录下自动生成监控解析文件;
[0040]
数据处理单元,被配置为对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理;
[0041]
输出单元,被配置为将经过归类整理及格式化处理后的数据结果输出至预设的excel文件中。
[0042]
优选地,重新封装后的所述paramiko库,包括:
[0043]
连接模块,用于多线程批量连接服务器集群;
[0044]
文件传输模块,用于传输性能监控工具nmon至各服务器以及提取监控文件;
[0045]
策略解析模块:用于根据输入的监控策略,生成相应的ubuntu命令;
[0046]
命令执行模块:用于在服务器端执行ubuntu命令。
[0047]
优选地,所述解析单元,包括:
[0048]
数据输入模块,用于提取文件路径,将文件路径下的excel文件加载至内存空间;
[0049]
宏调用模块,用于调用性能监控工具nmon客户端的excel宏来解析内存空间内的excel文件;
[0050]
数据输出模块,用于输出生成的excel文件至指定目录。
[0051]
优选地,所述数据处理单元,包括:
[0052]
关键性能数据提取模块,用于按照预设顺序对多个监控解析文件的关键性能数据进行提取,所述关键性能数据包括、但不限于io、cpu、mem、network;
[0053]
分类整理模块,用于对提取后的关键性能数据进行归类整理及差值计算;
[0054]
资源整合模块,用于对分类整理模块处理后的数据进行excel格式化,并输出文件。
[0055]
与现有技术相比,本发明的技术方案具有以下有益效果:
[0056]
本技术公开了一种性能测试数据收集方法及系统,使得在进行集群性能测试时,能够自动按照既定策略运行监控工具,自动收集集群内各个设备的性能数据,并进行关键数据抽取、归档整理。本技术的系统可以实现输入一组系统地址,策略执行完成后自动输出性能测试数据至目标文件夹的功能,本技术提高了集群模式下性能测试的工作效率,可以实现对服务器集群的精准监控。
附图说明
[0057]
构成本技术的一部分附图用来提供对本技术的进一步理解,本技术的示意性实施例及其说明用于解释本技术,并不构成对本技术的不当限定。在附图中:
[0058]
图1是本发明优选实施例的一种性能测试数据收集方法的流程示意图;
[0059]
图2是本发明优选实施例的一种性能测试数据收集系统的功能单元组成框图;
[0060]
图3是一种性能测试数据收集系统的解析单元的组成框图示意图;
[0061]
图4是一种性能测试数据收集系统的数据处理单元的组成框图示意图;
[0062]
图5是性能测试数据收集系统的执行过程示意图。
具体实施方式
[0063]
本发明提供一种性能测试数据收集方法及系统,为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
[0064]
实施例一:
[0065]
图1为本发明优选实施例的一种性能测试数据收集方法的流程示意图。
[0066]
如图1所示,一种性能测试数据收集方法,具体包括如下步骤:
[0067]
步骤s1,基于python-paramiko库的重新封装,获取多个待监控服务器的资源,其中,所述多个待监控服务器的资源包括:多个ubuntu系统和/或多个linux系统的地址、监控策略、用户名及密码。
[0068]
其中,所述python-paramiko库的重新封装,具体包括如下步骤:
[0069]
s11,读取基于批量任务的输入地址、用户名和密码;
[0070]
s12,使用python创建多线程;
[0071]
s13,在线程内使用paramiko库的ssh连接方法,批量建立对应的ssh连接,使paramiko库通过ssh方式批量登录并操作多个ubuntu系统和/或多个linux系统。
[0072]
重新封装后得到的python-paramiko库,被配置有如下功能:
[0073]
登录多个ubuntu系统和/或多个linux系统;
[0074]
执行原生ubuntu命令;
[0075]
从服务器向目标机器提供性能监控工具nmon;
[0076]
从目标机器提取监控数据文件;
[0077]
根据监控参数生成监控命令并执行;
[0078]
根据输入的ubuntu命令自动生成shell脚本。
[0079]
上述内容中,性能监控工具nmon(nigel’s monitor)是由ibm公司提供的、免费监控aix系统与linux系统资源的工具,它能在系统运行过程中实时地捕捉系统资源的使用情况,记录的信息比较全面,它可将服务器系统资源耗用情况收集起来并输出一个特定的文件,并可利用excel分析工具(nmon analyser)进行数据的统计分析。具体实现中,电子设备可以通过nmon对待监控服务器资源进行分析,得到表格文档,该表格文档记录了服务器资源的采样数据。
[0080]
上述内容中,所述监控策略主要参数有:监控时长、监控间隔、数据记录方式、数据颗粒度、数据存放目录等。
[0081]
参数组合举例如下:nmon[-f|-f文件名|-x|-x|-z][-r《运行名》][-t|-t|-y][-s秒][-c数][-w数][-ldpl][-d][-g文件名][-k disklist][-g][-k][-o输出路径][-d][-e][-j][-v][-p][-m][-n][-w][-s][-^][-o][-l][-i百分比][-a][-m《目录》][-z优先级][-i][-y选项]
[0082]
上述内容中,基于监控策略,nmon主要记录以下方面的数据:
[0083]
cpu占用率;
[0084]
内存使用情况;
[0085]
磁盘i/o速度、传输和读写比率;
[0086]
文件系统的使用率;
[0087]
网络i/o速度、传输和读写比率、错误统计率与传输包的大小;
[0088]
消耗资源最多的进程;
[0089]
计算机详细信息和资源;
[0090]
页面空间和页面i/o速度;
[0091]
用户自定义的磁盘组;
[0092]
网络文件系统。
[0093]
步骤s2,批量连接多个待监控服务器并部署性能监控工具nmon。
[0094]
步骤s3,根据获取的监控策略,通过性能监控工具nmon执行性能监控命令。
[0095]
步骤s4,提取多个待监控服务器的原始监控文件,使用python解析性能监控工具nmon客户端的excel宏,并在预设的目标目录下自动生成监控解析文件。
[0096]
具体过程为:使用python-paramiko库的xlrd和os,打开excel文件,查找性能监控工具nmon客户端指定的宏名称,对目标宏进行操作,使其解析原始监控文件,最后输出资源数据的excel文件至指定文件夹。
[0097]
步骤s5,对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理,并将处理后的数据结果输出至预设的excel文件中。
[0098]
该步骤是通过使用python封装一个能够批量获取并重新组合excel数据的工具实现的,具体包括如下步骤:
[0099]
重新封装python的openpyxl库,使得该工具具备如下功能:打开excel,提取excel指定位置的数据,创建新的excel文件,在excel内写入数据及公式,对比提取数据得出差值。
[0100]
该工具的输入为:预设的目标目录,该目标目录下存放一组监控解析文件。
[0101]
基于该工具实现步骤s5的具体操作包括:
[0102]
s51,根据输入的预设的目标目录,提取该目标目录对应路径下的所有excel文件;
[0103]
s52,根据所述工具内的sheet页及数据位置的参数,依次从每个excel文件中提取出预设的需求数据(例如,io、cpu、mem、network),暂存至内存空间;
[0104]
s53,获得所有数据后,根据监控策略进行差值计算;
[0105]
s54,新建excel文件,将提取出的需求数据及差值数据根据监控策略输出到该新建excel文件的指定sheet页的指定位置;
[0106]
s55,对新建的excel文件进行保存,并输出保存的路径。
[0107]
上述步骤s53中,所述获得所有数据后,根据监控策略进行差值计算,例如:两台服务器在负载同等压力下,判断资源消耗是否一致,如不一致,计算其差值,若该差值大于对应的参考数值,则对有问题的服务器进行性能问题排查。再例如,两台服务器在不同负载压力下,根据压力程度除以资源消耗比重,从而得到多个资源指标的多个差值,据此计算在服务器压力递增的情况下,资源消耗的比例及曲线。
[0108]
实施例二:
[0109]
本实施例给出了一种性能测试数据收集系统的设计示例。操作系统以linux为主,开发语言为python和shell,同时使用基于开源工具nmon。该系统的核心部分包括了:
[0110]
1)一个可以连接ubuntu系统或linux系统的工具,可以根据输入执行相应内置命令;
[0111]
2)一个excel宏解析工具,可以操作excel宏并输出监控解析文件;
[0112]
3)一个数据处理工具,根据输入的大量数据提取关键数据并进行组合保存;
[0113]
4)一个执行器,可以根据总体参数输入,在目标文件夹生成最终汇总文件。
[0114]
图2是本发明优选实施例的一种性能测试数据收集系统的功能单元组成框图。
[0115]
参阅图2所示,一种性能测试数据收集系统,包括:
[0116]
获取单元100,被配置为对原始的paramiko库进行重新封装,使其能获取多个待监控服务器的资源,其中,所述多个待监控服务器的资源包括:多个ubuntu系统和/或多个linux系统的地址、监控策略、用户名及密码;
[0117]
分析单元200,被配置为通过性能监控工具nmon对所述待监控服务器资源进行分析,得到多个待监控服务器的原始监控文件;
[0118]
解析单元300,被配置为使用python解析性能监控工具nmon客户端的excel宏,并在预设的目标目录下自动生成监控解析文件;
[0119]
数据处理单元400,被配置为对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理;
[0120]
输出单元500,被配置为将经过归类整理及格式化处理后的数据结果输出至预设的excel文件中。
[0121]
其中,重新封装后的所述paramiko库,包括:
[0122]
连接模块,用于多线程批量连接服务器集群;
[0123]
文件传输模块,用于传输性能监控工具nmon至各服务器以及提取监控文件;
[0124]
策略解析模块:用于根据输入的监控策略,生成相应的ubuntu命令;
[0125]
命令执行模块:用于在服务器端执行ubuntu命令。
[0126]
参阅图3所示,上述内容中,所述解析单元300,包括:
[0127]
数据输入模块301,用于提取文件路径,将文件路径下的excel文件加载至内存空间;
[0128]
宏调用模块302,用于调用性能监控工具nmon客户端的excel宏来解析内存空间内的excel文件;
[0129]
数据输出模块303,用于输出生成的excel文件至指定目录。
[0130]
参阅图4所示,上述内容中,所述数据处理单元400,包括:
[0131]
关键性能数据提取模块401,用于按照预设顺序对多个监控解析文件的关键性能数据进行提取,所述关键性能数据包括、但不限于io、cpu、mem、network;
[0132]
分类整理模块402,用于对提取后的关键性能数据进行归类整理及差值计算;
[0133]
资源整合模块403,用于对分类整理模块402处理后的数据进行excel格式化,并输出文件。
[0134]
参阅图5所示,该性能测试数据收集系统运行时,其输入为:监控策略及多个服务器的地址及账户。然后依次执行:批量连接服务器并部署性能监控工具,根据输入的监控策略执行性能监控命令,提取服务器内的监控原始文件,操作excel宏解析监控原始文件并生成监控数据,对监控数据进行格式化处理及归类处理。最后,系统输出为:目标文件夹内的监控数据分析集合。
[0135]
综上所述,本技术公开了一种性能测试数据收集方法及系统,使得在进行集群性
能测试时,能够自动按照既定策略运行监控工具,自动收集集群内各个设备的性能数据,并进行关键数据抽取、归档整理。本技术的系统可以实现输入一组系统地址,策略执行完成后自动输出性能测试数据至目标文件夹的功能,本技术提高了集群模式下性能测试的工作效率,可以实现对服务器集群的精准监控。
[0136]
需要说明的是,对于前述的方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本技术并不受所描述的动作顺序的限制,因为依据本技术,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本技术所必须的。
[0137]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0138]
在本技术所提供的几个实施例中,应该理解到,所揭露的系统,可通过其它的方式实现。例如,以上所描述的系统实施例仅仅是示意性的,例如上述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。
[0139]
上述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0140]
另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0141]
以上对本发明的具体实施例进行了详细描述,但其只是作为范例,本发明并不限制于以上描述的具体实施例。对于本领域技术人员而言,任何对本发明进行的等同修改和替代也都在本发明的范畴之中。因此,在不脱离本发明的精神和范围下所作的均等变换和修改,都应涵盖在本发明的范围内。

技术特征:
1.一种性能测试数据收集方法,其特征在于,包括:基于python-paramiko库的重新封装,获取多个待监控服务器的资源,其中,所述多个待监控服务器的资源包括:多个ubuntu系统和/或多个linux系统的地址、监控策略、用户名及密码;批量连接多个待监控服务器并部署性能监控工具nmon;根据获取的监控策略,通过性能监控工具nmon执行性能监控命令;提取多个待监控服务器的原始监控文件,使用python解析性能监控工具nmon客户端的excel宏,并在预设的目标目录下自动生成监控解析文件;对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理,并将处理后的数据结果输出至预设的excel文件中。2.根据权利要求1所述的一种性能测试数据收集方法,其特征在于,所述获取多个待监控服务器的资源,是通过重新封装python-paramiko库实现的,所述python-paramiko库的重新封装,具体包括如下步骤:读取基于批量任务的输入地址、用户名和密码;使用python创建多线程;在线程内使用paramiko库的ssh连接方法,批量建立对应的ssh连接,使paramiko库通过ssh方式批量登录并操作多个ubuntu系统和/或多个linux系统。3.根据权利要求2所述的一种性能测试数据收集方法,其特征在于,重新封装后得到的python-paramiko库,被配置有如下功能:登录多个ubuntu系统和/或多个linux系统;执行原生ubuntu命令;从服务器向目标机器提供性能监控工具nmon;从目标机器提取监控数据文件;根据监控参数生成监控命令并执行;根据输入的ubuntu命令自动生成shell脚本。4.根据权利要求1所述的一种性能测试数据收集方法,其特征在于,所述使用python解析性能监控工具nmon客户端的excel宏,具体包括如下步骤:使用python-paramiko库的xlrd和os,打开excel文件,查找性能监控工具nmon客户端指定的宏名称,对目标宏进行操作,使其解析原始监控文件,最后输出资源数据的excel文件至指定文件夹。5.根据权利要求1所述的一种性能测试数据收集方法,其特征在于,所述对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理,并将处理后的数据结果输出至预设的excel文件中,是通过使用python封装一个能够批量获取并重新组合excel数据的工具实现的,具体包括如下步骤:重新封装python的openpyxl库,使得该工具具备如下功能:打开excel,提取excel指定位置的数据,创建新的excel文件,在excel内写入数据及公式,对比提取数据得出差值。6.根据权利要求5所述的一种性能测试数据收集方法,其特征在于,所述对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理,并将处理后的数据结果输出至预设的excel文件中,具体包括如下步骤:
根据输入的预设的目标目录,提取该目标目录对应路径下的所有excel文件;根据所述工具内的sheet页及数据位置的参数,依次从每个excel文件中提取出预设的需求数据,暂存至内存空间;获得所有数据后,根据监控策略进行差值计算;新建excel文件,将提取出的需求数据及差值数据根据监控策略输出到该新建excel文件的指定sheet页的指定位置;对新建的excel文件进行保存,并输出保存的路径。7.一种性能测试数据收集系统,其特征在于,包括:获取单元,被配置为对原始的paramiko库进行重新封装,使其能获取多个待监控服务器的资源,其中,所述多个待监控服务器的资源包括:多个ubuntu系统和/或多个linux系统的地址、监控策略、用户名及密码;分析单元,被配置为通过性能监控工具nmon对所述待监控服务器资源进行分析,得到多个待监控服务器的原始监控文件;解析单元,被配置为使用python解析性能监控工具nmon客户端的excel宏,并在预设的目标目录下自动生成监控解析文件;数据处理单元,被配置为对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理;输出单元,被配置为将经过归类整理及格式化处理后的数据结果输出至预设的excel文件中。8.根据权利要求7所述的一种性能测试数据收集系统,其特征在于,重新封装后的所述paramiko库,包括:连接模块,用于多线程批量连接服务器集群;文件传输模块,用于传输性能监控工具nmon至各服务器以及提取监控文件;策略解析模块:用于根据输入的监控策略,生成相应的ubuntu命令;命令执行模块:用于在服务器端执行ubuntu命令。9.根据权利要求7所述的一种性能测试数据收集系统,其特征在于,所述解析单元,包括:数据输入模块,用于提取文件路径,将文件路径下的excel文件加载至内存空间;宏调用模块,用于调用性能监控工具nmon客户端的excel宏来解析内存空间内的excel文件;数据输出模块,用于输出生成的excel文件至指定目录。10.根据权利要求7所述的一种性能测试数据收集系统,其特征在于,所述数据处理单元,包括:关键性能数据提取模块,用于按照预设顺序对多个监控解析文件的关键性能数据进行提取,所述关键性能数据包括io、cpu、mem、network;分类整理模块,用于对提取后的关键性能数据进行归类整理及差值计算;资源整合模块,用于对分类整理模块处理后的数据进行excel格式化,并输出文件。

技术总结
本申请公开了一种性能测试数据收集方法及系统,所述方法包括:基于paramiko库的重新封装,获取多个待监控服务器的资源;批量连接多个待监控服务器并部署性能监控工具Nmon;根据获取的监控策略,通过Nmon执行性能监控命令;提取多个待监控服务器的原始监控文件,使用python解析Nmon客户端的Excel宏,并在预设的目标目录下自动生成监控解析文件;对存储于预设的目标目录下的监控解析文件进行归类整理及格式化处理,并将处理后的数据结果输出至预设的excel文件中。所述系统可以实现输入一组系统地址,策略执行完成后自动输出性能测试数据至目标文件夹的功能。本申请提高了集群模式下性能测试的工作效率。式下性能测试的工作效率。式下性能测试的工作效率。


技术研发人员:陈远明 吴一拓
受保护的技术使用者:上海轩田工业设备有限公司
技术研发日:2022.07.04
技术公布日:2022/11/1
转载请注明原文地址: https://tieba.8miu.com/read-7696.html

最新回复(0)