技术领域
[0001] 本公开涉及计算机技术领域,特别是涉及一种故障上报方法、电子设备、介质及计算机程序产品。
相关背景技术
[0002] 当前在服务器各种应用场景中,对故障诊断上报一直有优化更新的需求。相关技术中使用IPMI(Intelligent Platform Management Interface,智能平台管理接口)将寄存器内的故障诊断信息发送给BMC。然而,IPMI有字节数的限制,如果故障诊断信息超过IPMI单次能发送的最大字节数,那么需要IPMI调用多次。然而,IPMI的调用在SMI(System Management Interrupt,系统管理中断)的状态下进行,多次调用IPMI会导致SMI的时间过长,会影响到客户的业务连续性。
具体实施方式
[0021] 下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
[0022] 本公开的说明书和权利要求书中的术语“第一”、“第二”等是用于区别类似的对象,而不用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施,且“第一”、“第二”等所区分的对象通常为一类,并不限定对象的个数,例如第一对象可以是一个,也可以是多个。此外,说明书以及权利要求中“和/或”表示所连接对象的至少其中之一,字符“/”,一般表示前后关联对象是一种“或”的关系。
[0023] 在相关技术中,为了提高故障诊断解析准确度等需求,通常会通过增加寄存器的方式,例如IERR(Internal Error,内部错误)寄存器,PCIE错误状态寄存器等,寄存器的增加会增加故障诊断信息的信息量。由于IPMI有字节数的限制,每次最多只能发255个字节,如果要发送大于255个字节的就需要多次调用。因此然后随着寄存器的增加,通过调用IPMI发送故障诊断信息,会导致SMI花费的时间过长。并且每次调用IPMI发送故障诊断信息花费的时间是波动的,这会导致业务波动。
[0024] 因此,使用IPMI发送故障诊断信息,会影响到业务连续性,影响工作效率和实时性,特别是对于需要24小时不间断运行的场景影响更大。
[0025] 为了解决上述技术问题,本公开提出一种故障上报方法,所述方法能够避免SMI花费过长时间。
[0026] 图1是本公开实施例示出的一种故障上报方法的步骤示意图。如图1所示,所述故障上报方法具体可以包括如下步骤:步骤S11:在系统内设备出现故障的情况下,触发系统管理中断。
[0027] 当检测到某个设备出现故障时,例如硬件故障、过热、连接问题等,立即触发SMI。确保了系统在检测到故障后能够迅速采取行动,减少了故障对系统运行的潜在影响。
[0028] 步骤S12:通过基本输入输出系统从所述设备对应的寄存器内获取故障诊断信息。
[0029] 当触发SMI后,CPU会暂停当前执行的任务,转而执行BIOS(Baseboard Manager Controller,基本输入输出系统)中的SMI处理程序。BIOS可以通过特定的指令或接口,访问出现故障的设备对应的寄存器。故障的设备对应的寄存器中包括故障的详细信息,如错误代码、故障类型等,这些信息就是该设备的故障对应的故障诊断信息。BIOS读取并收集这些寄存器中的故障诊断信息。
[0030] 通过BIOS从设备对应的寄存器中获取故障诊断信息,保证了信息的准确性和来源的可靠性。
[0031] 步骤S13:通过所述基本输入输出系统将所述故障诊断信息写入共享内存的指定区域。
[0032] BIOS将从寄存器内收集到的故障诊断信息,写入到共享内存的指定区域。共享内存是预先分配的,BIOS可以直接访问所述共享内存。共享内存的指定区域是指共享内存中的某一个部分。BIOS将故障诊断信息写入到共享内存的指定区域的时候,需要保证数据的完整性和一致性,避免数据丢失或损坏。
[0033] 步骤S14:在所述故障诊断信息写入所述共享内存的指定区域后,停止系统管理中断。
[0034] 在BIOS将故障诊断信息成功且完整地写入共享内存的指定区域后,可以通过BIOS向CPU发送一个信号,表示本次SMI处理完成。CPU收到信号后,恢复系统的正常运行。
[0035] 步骤S15:控制基板管理控制器从所述共享内存的指定区域,读取所述故障诊断信息。
[0036] BMC(Baseboard Manager Controller,基板管理控制器)也可以直接访问共享内存的指定区域,可以从共享内存的指定区域获取故障诊断信息。在BIOS将故障诊断信息写入共享内存的指定区域后,由BMC从共享内存的指定区域读取该故障诊断信息。无需调用IPMI发送故障诊断信息。
[0037] 采用本公开的实施例,利用共享内存的高速访问特性,将故障诊断信息写入共享内存的指定区域,有助于减少信息上报的延迟,提高系统的整体响应速度。在故障诊断信息成功写入共享内存后,停止SMI,避免了不必要的系统开销,确保系统在处理故障的同时能够维持正常的运行效率。控制BMC从共享内存的指定区域读取故障诊断信息,可以避免调用PIMI,有效提高整机持续可用时间。控制BMC从共享内存的指定区域读取故障诊断信息,实现对故障的远程监控和管理,提高了系统的可维护性和可靠性。
[0038] 为了数据的完整性和安全性,需要对获取到的故障诊断信息进行验证,可以通过比较故障诊断信息携带的原始校验值和重新计算的校验值比较,确定故障诊断信息是否满足完整性和安全性的需求。
[0039] 以下是实现故障诊断信息携带原始校验值的方法。
[0040] 其中,在一种可选的实施例中,在通过所述基本输入输出系统将所述故障诊断信息写入共享内存的指定区域之前,包括:计算所述故障诊断信息对应的循环冗余校验值;所述循环冗余校验值用于校验数据安全;将所述循环冗余校验值添加到所述故障诊断信息对应的数据包的末尾,得到添加循环冗余校验值后的故障诊断信息;所述通过所述基本输入输出系统将所述故障诊断信息写入共享内存的指定区域,包括:通过所述基本输入输出系统,将所述添加循环冗余校验值后的故障诊断信息写入所述共享内存的指定区域。
[0041] 本公开可以使用CRC(Cyclic Redundancy Check,循环冗余校验)确定故障诊断信息的校验值。
[0042] 在BIOS获取到故障诊断信息之后,在BIOS将故障诊断信息写入共享内存的指定区域之前。计算此时的故障诊断信息对应的循环冗余校验值,并将循环冗余校验值添加到故障诊断信息对应的数据包的末尾,使得故障诊断信息携带用于校验的循环冗余校验值。在某个设备需要使用该故障诊断信息或接收到该故障诊断信息的时候,可以使用故障诊断信息携带的循环冗余校验值对循环冗余校验值的完整性进行校验。
[0043] 通过BIOS,将添加循环冗余校验值后的故障诊断信息写入到共享内存的指定区域。
[0044] 采用本公开的实施例,通过循环冗余校验值,能够有效检测出在数据传输或存储过程中可能发生的错误。通过添加循环冗余校验值并在接收端进行校验,可以及时发现并纠正数据错误,从而显著降低数据错误率。通过添加循环冗余校验值,还能在一定程度上防止数据被恶意篡改。通过循环冗余校验值,系统能够容忍一定程度的错误,从而增强了系统的容错能力。
[0045] 以下是使用循环冗余校验值对故障诊断信息的完整性进行校验的方法,其中,在一种可选的实施例中,在基板管理控制器从所述共享内存的指定区域,读取所述故障诊断信息后,还包括:计算读取到的所述故障诊断信息对应的目标循环冗余校验值;判断所述目标循环冗余校验值与所述循环冗余校验值是否一致;在不一致的情况下,确定所述故障诊断信息出现数据错误,并生成数据错误对应的告警日志;在一致的情况下,对所述故障诊断信息进行解析,得到所述故障诊断信息的解析结果。
[0046] 在BMC从共享内存的指定区域,读取到故障诊断信息后,需要对故障诊断信息的完整性进行校验。
[0047] 计算获取到的故障诊断信息对应的目标循环冗余校验值。并从故障诊断信息中确定故障诊断信息携带的循环冗余校验值。通过将目标循环冗余校验值与循环冗余校验值进行比较,判断目标循环冗余校验值与循环冗余校验值是否一致,来确定故障诊断信息的完整性。其中,目标循环冗余校验值与循环冗余校验值采用同一种计算策略得到,同一种计算策略表示:当对同一段数据进行多次计算的时候,多次计算得到的计算结果是一致的。
[0048] 在目标循环冗余校验值与循环冗余校验值一致的情况下,表示故障诊断信息没有被篡改,没有出现数据错误,可以在后续的业务中使用该故障诊断信息,例如对故障诊断信息进行解析,确定故障设备对应的信息。
[0049] 在目标循环冗余校验值与循环冗余校验值不一致的情况下,说明故障诊断信息的完整性测试没有通过,故障诊断信息可能存在缺失或者篡改的问题,存在数据错误,因此该故障诊断信息不能被正常使用,可以根据数据错误生成对应的告警日志,告警日志用于指示此处数据存在问题,需要进行处理。
[0050] 采用本公开的实施例,通过计算读取到的故障诊断信息的目标循环冗余校验值,并将目标循环冗余校验值与循环冗余校验值进行对比,可以确保数据的完整性,及时发现并报告数据错误。旦发现目标循环冗余校验值不一致,系统能够立即确定故障诊断信息存在数据错误,并生成相应的告警日志,有助于运维人员迅速定位问题,采取必要的修复措施。在循环冗余校验值一致的情况下,使用该故障诊断信息进行后续的业务处理,可以确保业务的连续性。
[0051] 其中,在一种可选的实施例中,在基板管理控制器从所述共享内存的指定区域,读取所述故障诊断信息后,还包括:确定所述故障诊断信息对应的总数据段;从所述总数据段中确定目标数据段;对所述目标数据段进行解析,得到所述目标数据段的解析结果;在所述目标数据段解析完成后,根据所述目标数据段的大小,确定下一个进行解析的数据段在所述总数据段的起始偏移量;根据所述起始偏移量,确定所述下一个进行解析的数据段;对所述下一个进行解析的数据段进行解析。
[0052] 在本公开中,为了完成对设备故障进行上报,在获取到故障诊断信息后,需要对故障诊断信息进行解析,确定各个故障设备对应的故障原因,方便用户处理。
[0053] 每次触发SMI的时候,可能会存在一个或多个设备出现故障,或者一个设备出现多种类型的故障,因此BMC读取到的各个故障诊断信息都可以包括一个或多个数据段,每个数据段都是一个错误类型。各个数据段组成一个总数据段。
[0054] 通过BMC依次对各个数据段进行解析,按照顺序处理每一段数据,确保所有数据都被正确处理。具体可以从总数据段对应的第一个数据段进行解析,依次解析到总数据段对应的最后一个数据段。
[0055] 将当前解析的数据段确定为目标数据段,可以通过目标数据段中对应位置的第一字节信息,例如:目标数据段的字节6,确定总数据段有几段,以及目标数据段位于总数据段的第几段。
[0056] 通过获取总数据段包括的数据段的数量以及当前目标数据段位于总数据段的第几段,可以有效确保所有数据段都被接收和处理,当出现数据段丢失或错误的时候,能够根据当前段和总段的信息生成相应的告警日志,帮助维护人员快速定位和解决问题。并且了解当前目标数据段是总数据段的第几段可以帮助BMC按照正确的顺序处理数据。
[0057] 在对目标数据段解析完成之后,可以得到目标数据段的解析结果,目标数据段的解析结果可以表示一个错误类型对应的错误信息。
[0058] 完成对目标数据段的解析之后,如果总数据段中还有未解析的数据段,继续对未解析的数据段进行解析。
[0059] 可以通过目标数据段中对应位置的第二字节信息,例如:目标数据段的字节7,确定目标数据段相邻的下一个数据段的起始偏移量。可以通过目标数据段的大小,确定下一个需要解析的数据段的起始偏移量。通过计算下一段的起始偏移量,BMC可以快速定位到下一段数据,减少查找时间,从而提高处理效率。
[0060] 在完成对目标数据段的解析之后,通过下一个需要解析的数据段的起始偏移量对该数据段进行定位,然后对该数据段进行解析,得到该数据段对应的解析结果。
[0061] 按照一定的顺序,依次完成对总数据段中包括的所有数据段的解析,在完成所有数据段的解析的时候,表示该故障诊断信息解析完成。可以对下一个未解析的故障诊断信息进行解析。
[0062] 采用本公开的实施例,确保了BMC能够准确识别并定位到包含完整故障诊断信息的总数据段。通过解析目标数据段,BMC能够提取出具体的故障诊断信息,提高后续的诊断、修复和记录的效率。在完成一个数据段的解析后,BMC需要能够准确地找到下一个数据段的起始位置,并且确保了BMC能够按顺序、无遗漏地处理总数据段中的所有数据。依次完成处理可以确保所有数据段都被处理,避免遗漏或重复处理某一段数据,从而保障数据的完整性和准确性。
[0063] 为了实现在解析故障诊断信息的时候按照数据段的方式进行解析,需要在BIOS收集故障诊断信息的时候就按照指定规则格式进行收集,并在写入共享内存的指定区域的时候也要保证故障诊断信息是以指定规则格式进行写入的,以使得,BMC在获取到故障诊断信息并对故障诊断信息进行解析的时候,使用的故障诊断信息也符合指定规则格式。
[0064] 其中,在一种可选的实施例中,所述通过基本输入输出系统从所述设备对应的寄存器内获取故障诊断信息,包括:确定所述设备对应的寄存器内的故障数据;确定所述故障数据包括的错误类型;将各个所述错误类型确定为对应的数据段;所述数据段包括所述错误类型对应的错误域、子错误域、处在阶段、模式以及顺序号;通过将各个所述数据段依次排列,得到总数据段;通过所述总数据段,得到所述故障诊断信息。
[0065] 按照指定规则格式从故障设备对应的寄存器内获取故障信息,例如对于一个故障类型,需要获取该故障类型包括的错误域,子错误域,处在阶段,模式,顺序号等故障信息,并将故障类型对应的故障信息确定为一个数据段。
[0066] 在本次触发的SMI对应多个故障类型的情况下,将各个故障类型都按照相同的方式确定为与故障类型对应的数据段。并将各个数据段进行组合,得到一个总数据段,总数据段由这些故障类型对应的数据段组成。各个数据段在总数据段中可以是依次排列的。
[0067] 还可以确定一个总数据段对应的整体信息,例如,数据包长度,命令字,将整体信息添加到总数据段对应的数据包的头部。
[0068] 将故障诊断信息以数据段的形式写入共享内存的指定区域。
[0069] 采用本公开的实施例,这一步将每个错误类型封装成一个独立的数据段,结构化的数据表示方式有助于后续的数据解析和处理。将各个数据段按一定顺序排列成一个总数据段,确保了所有故障数据都被完整、有序地包含在内,有助于BIOS在后续处理中能够全面地了解设备的故障情况。
[0070] BMC处理的数据需要传输到终端,使得管理员及时了解系统运行情况,在设备出现故障的时候,可以根据BMC传输的这些信息迅速采取措施。
[0071] 其中,在一种可选的实施例中,在得到所述故障诊断信息的解析结果后,或,在生成数据错误对应的告警日志后,还包括:通过所述基板管理控制器,向终端上报所述解析结果或所述告警日志。
[0072] 在通过循环冗余校验值发现故障诊断信息出现数据错误的后,或,在对故障诊断信息进行解析得到故障诊断信息的解析结果后,BMC会将数据错误对应的告警日志,或解析结果传输给终端。其中,在对故障诊断信息进行解析时,是对故障诊断信息包括的各个数据段进行依次解析,每解析完一个数据段得到对应的解析结果后,就将该数据段对应的解析结果上报给中断,在对故障诊断信息中包括的所有数据段均完成解析后,完成对故障诊断信息的解析。
[0073] 采用本公开的实施例,通过BMC将处理信息发送给终端,可以使得运维人员及时了解系统运行情况。将故障信息发送给终端可以帮助进行数据记录,可以通过对历史故障数据的分析,可以识别出系统的薄弱环节。将故障信息发送给终端可以提高系统运行的透明度,相关人员能够清晰了解系统的运行状况和故障信息。
[0074] 共享内存的指定区域按照以下步骤进行确定。
[0075] 其中,在一种可选的实施例中,还包括:在系统上电后,使用所述基板管理控制器分配所述共享内存;将所述共享内存映射到基本输入输出系统内存中;所述基本输入输出系统和所述基板管理控制器能够访问所述共享内存;将所述共享内存的一部分确定为所述共享内存的指定区域。
[0076] 系统上电指的是将电源连接到计算机或其他电子设备,从而使其开始运行和初始化的过程。当系统接通电源并完成初步的自检过程后,系统进入初始化阶段。BMC开始运行其固件代码,进行系统管理和监控任务。
[0077] BMC可以检查系统的物理内存资源,包括可用于共享的内存区域。按照预先制定的分配策略,可以通过BMC分配一定大小的内存区域作为共享内存。共享内存的大小可以根据系统需求和预期的数据量来确定。
[0078] 分配完成后,BMC将共享内存映射到BIOS的内存空间中。通过映射可以确保BIOS能够访问共享内存,具体可以通过特定的内存地址范围来访问共享内存。
[0079] 共享内存能够被BIOS和BMC访问,BIOS和BMC通过各自的内存访问机制来访问共享内存,对共享内存进行写操作或读操作。
[0080] 随后将共享内存的一部分确定为所述共享内存的指定区域,确保不影响共享内存其他区域的使用。
[0081] 采用本公开的实施例,通过共享内存存储数据,且允许BIOS和BMC直接访问共享的数据区域,无需通过其他中间介质,从而减少了通信延迟。共享内存允许BIOS和BMC以接近内存访问的速度进行数据交换,可以提高数据传输的速率。通过合理划分共享内存的区域,可以实现对系统资源的优化利用,避免资源浪费。
[0082] 其中,在一种可选的实施例中,还包括:控制所述基板管理控制器以轮询的方式,监测所述共享内存的指定区域中是否存在未读取的所述故障诊断信息;所述控制基板管理控制器从所述共享内存的指定区域,读取故障诊断信息,包括:在监测到所述共享内存的指定区域中存在未读取的所述故障诊断信息的情况下,控制所述基板管理控制器从所述共享内存的指定区域读取所述故障诊断信息。
[0083] BMC以轮询的方式访问共享内存的指定区域,查询共享内存的指定区域中是否存在故障诊断信息。轮询的方式表示每间隔预设时间执行同样的操作,在本公开中,通过轮询的方式,使得BMC每间隔预设时间访问共享内存的指定区域,以监测所述共享内存的指定区域中是否存在未读取的所述故障诊断信息。
[0084] 由于,每一次BMC从共享内存的指定区域中读取故障诊断信息的时候,会将共享内存的指定区域中的全部故障诊断信息都读取。因此,当BMC在共享内存的指定区域中访问到故障诊断信息的时候,表示当前共享内存的指定区域中存在未读取的故障诊断信息。
[0085] 当BMC检测到共享内存的指定区域中存在未读取的故障诊断信息的时候,控制BMC从共享内存的指定区域中读取故障诊断信息,使得BMC获得故障诊断信息。
[0086] 采用本公开的实施例,通过轮询机制,BMC能够定期、快速地检查共享内存中的指定区域,确保一旦有故障诊断信息被写入,就能被及时发现和处理,可以快速响应和修复系统故障。使用轮询方式对故障诊断信息进行检测,简化了系统架构,降低了实现成本,并有效利用了系统资源。通过持续监测共享内存,BMC能够确保所有生成的故障诊断信息都被及时读取,避免了因信息遗漏而导致的故障排查困难。
[0087] 可以将共享内存的指定区域设定为环形缓存,当写入指针到达数组的末尾时,它会回绕到数组的开始部分,形成一个循环。环形缓存包括两个指针:一个是写指针,另一个是读指针,两个指针可以独立移动,从而允许在缓存中并行读写,具体为通过移动写指针,将数据暂存到环形缓存等待被读取,通过移动读指针将数据读出环形缓存并释放环形缓存空间。写指针偏移用于表示写指针位于环形缓存的位置,读指针偏移用于表示读指针位于环形缓存的位置。通过比较写指针偏移和读指针偏移的关系来判断环形缓存是否有数据可读或者环形缓存是否有空间可写。环形缓存可以进一步节省共享内存,环形缓存对应的内存可以重复使用,且可以有效避免对环形缓存中其他区域的使用的影响。
[0088] 其中,在从共享内存中划定指定区域并将指定区域设定为环形缓存的时候,需要保证环形缓存中的数据在读取之前不会被新写入的数据覆盖。例如,在本公开中,环形缓存的大小可以设置为32KB。具体的设置步骤可以是,首先确定读操作每次会间隔的最大时间,以及由于设备故障触发的SMI的频率,SMI对应的故障诊断信息能达到的最大字节,通过这些信息,确定一个合适的环形缓存的大小,避免由于读取不及时导致的数据覆盖。
[0089] 其中,在一种可选的实施例中,所述共享内存的指定区域为环形缓存,所述环形缓存包括读指针和写指针;控制所述基板管理控制器以轮询的方式,监测所述共享内存的指定区域中是否存在未读取的所述故障诊断信息,包括:每间隔预设时间,控制所述基板管理控制器监测所述环形缓存对应的所述写指针偏移和所述读指针偏移;在所述写指针偏移和所述读指针偏移不位于所述环形缓存的同一位置的情况下,确定所述共享内存的指定区域中存在未读取的所述故障诊断信息。
[0090] 在共享内存的指定区域为环形缓存的情况下,由于环形缓存管理两个指针,包括读指针和写指针。其中读指针偏移用于指示环形缓存中可读的位置,写指针偏移用于指示环形缓存中可写的位置。
[0091] 由于每一次BMC从环形缓存中读取故障诊断信息的时候,都会将环形缓存中的所有故障诊断信息都读取完,因此,在环形缓存中没有未读取的故障诊断信息的时候,读指针偏移和写指针偏移有应该指示环形缓存中的同一的。
[0092] BMC可以每间隔预设时间,就查询环形缓存中读指针偏移和写指针偏移在环形缓存中的位置。
[0093] 如果写指针偏移和读指针偏移不位于所述环形缓存的同一位置,那么就说明当前写指针偏移相对读指针偏移有移动,也就说明在本次监测和上一次监测期间,有新的数据写入环形缓存,从而导致写指针的移动,更新了写指针偏移。而BMC只在每次监测并且监测到未读取的故障诊断信息的情况下才会对环形缓存中的故障诊断信息进行读取,因此,在本次监测和上一次监测期间,环形缓存中的故障诊断信息不会被BMC读取,因此,对于BMC来说,本次监测到的环形缓存中的故障诊断信息是未读取的故障诊断信息。
[0094] 采用本公开的实施例,BMC通过轮询方式定期监测写指针和读指针的偏移,可以快速确定是否有新的故障诊断信息,从而实现对系统状态的实时监控。通过持续监测写指针和读指针的偏移,可以确保所有生成的故障诊断信息都被及时读取,避免了因信息遗漏而导致的故障排查困难。BMC通过监测指针偏移来判断是否存在未读取的故障诊断信息,从而可以合理调度系统资源,确保关键任务的优先处理。环形缓存和BMC的轮询机制可以方便地集成到现有的系统中。
[0095] 在监测到共享内存的指定区域中存在未读取的故障诊断信息的时候,对共享内存的指定区域中的故障诊断信息进行读取。
[0096] 其中,在一种可选的实施例中,所述共享内存的指定区域为环形缓存,所述环形缓存包括读指针和写指针;所述在监测到所述共享内存的指定区域中存在未读取的所述故障诊断信息的情况下,控制所述基板管理控制器从所述共享内存的指定区域读取所述故障诊断信息,包括:计算所述读指针偏移和所述写指针偏移之间的可读长度;控制所述基板管理控制器从所述读指针偏移开始执行对所述故障诊断信息的读操作,获取所述故障诊断信息;在将所述故障诊断信息读取完成后,基于所述写指针偏移更新所述读指针偏移;更新后的所述读指针偏移于所述写指针偏移位于所述环形缓存的同一位置。
[0097] 在共享内存的指定区域为环形缓存的时候,可以通过环形缓存管理的读指针和写指针对环形缓存中的数据进行读取。
[0098] 首先,计算写指针偏移和读指针偏移之间的长度,针偏移和读指针偏移之间的长度用于表示当前环形缓存中的可读长度。可读长度表示能够读取到的数据大小。
[0099] 在确定可读长度之后,控制BMC从读指针偏移开始进行数据读取,直到将可读长度对应的数据全部读取完成,以获得当前环形缓存中全部的未读取的故障诊断信息。
[0100] 在BMC读取故障诊断信息完成后,更新读指针偏移。
[0101] 由于在BMC将环形缓存中未读取的故障诊断信息全部读取,当前环形缓存中不存在未读取的故障诊断信息,因此,在读取完成后,更新后的读指针偏移会应该与写指针偏移位于环形缓存中的同一位置,对于如何更新读指针偏移,也是将写指针偏移作为调整读指针偏移的依据。
[0102] 采用本公开的实施例,通过计算读指针偏移和写指针偏移之间的可读长度,BMC能够迅速定位到待读取的故障诊断信息,从而减少了数据读取的延迟。从读指针偏移开始执行读操作,确保了数据读取的顺序性,避免了因数据乱序而导致的处理错误。读取完成后,基于写指针偏移更新读指针偏移,确保了数据的完整性,避免了因指针错位而导致的数据丢失。
[0103] 其中,在一种可选的实施例中,所述共享内存的指定区域为环形缓存,所述环形缓存包括读指针和写指针;所述通过所述基本输入输出系统将所述故障诊断信息写入共享内存的指定区域,包括:确定所述故障诊断信息的大小;确定写指针偏移;所述写指针偏移用于表示写指针位于所述环形缓存中的位置,以及用于指示所述环形缓存的可写位置;通过所述写指针偏移,确定所述写指针偏移到所述环形缓存的缓存尾的可写长度;所述环形缓存的缓存尾表征:所述环形缓存的最末端;通过所述故障诊断信息的大小和所述可写长度,判断从所述写指针偏移开始,将所述故障诊断信息全部写入所述环形缓存后,是否超过所述缓存尾;通过判断是否超过所述缓存尾,确定与判断结果对应的写入策略;通过所述写入策略,将所述故障诊断信息写入所述环形缓存。
[0104] 在将共享内存的指定区域设定为环形缓存后,通过环形缓存的读指针和写指针,对环形缓存中的数据进行读取或者写入。写指针偏移表示写指针在环形缓存的位置,指示了环形缓存中可写的位置。
[0105] 在将数据写入环形缓存的时候,如果数据已经到达环形缓存的尾部,那么会使用对应的异常处理函数,回滚到环形缓存的头部。
[0106] 因此,在BIOS将故障诊断信息写入所述共享内存之前,首先确定本次写入的故障诊断信息的大小,具体可以通过确定故障诊断信息的数据长度确定。然后,确定当前写指针便宜与到所述环形缓存的缓存尾的可写长度。环形缓存的缓存尾表示环形缓存的最末端,当数据超过缓存尾的时候,会触发异常处理函数,回滚到环形缓存的头部,也就是环形缓存的起始,从环形缓存的起始继续写入数据。
[0107] 将故障诊断信息的大小与环形缓存的可写长度进行对比,可以确定本次对故障诊断信息的写入是否会触发环形缓存的数据回滚。如果故障诊断信息的大小不超过环形缓存的可写长度,那么本次写入的故障诊断信息不会超过缓存尾,也就不会触发环形缓存的回滚;如果故障诊断信息的大小超过环形缓存的可写长度,那么本次写入的故障诊断信息会超过缓存尾,也就会触发环形缓存的回滚,会从环形缓存的起始继续写入数据。在环形缓存的起始存在未读取的数据的情况下,新写入的数据会对未读取的数据进行覆盖,导致数据丢失。
[0108] 因此,对于故障诊断信息的大小不超过环形缓存的可写长度,以及故障诊断信息的大小超过环形缓存的可写长度的两种情景,会使用不同的写入策略对故障诊断信息进行写入。
[0109] 在得到故障诊断信息的大小与环形缓存的可写长度的判断结果之后,执行不同的写入策略对故障诊断信息进行写入。
[0110] 采用本公开的实施例,通过使用环形缓存,系统可以高效地管理故障诊断信息的存储,无需频繁地分配和释放内存,减少了内存碎片和管理开销。写指针和读指针的使用确保了数据的有序存储和读取,避免了数据的混乱和丢失。系统能够根据故障诊断信息的大小和环形缓存的可写长度动态调整写入策略,确保新的故障诊断信息能够被正确存储。通过判断故障诊断信息写入后是否超过缓存尾,可以确保数据不会被意外覆盖。
[0111] 其中,在一种可选的实施例中,通过判断是否超过所述缓存尾,确定与判断结果对应的写入策略,包括:在不超过所述缓存尾的情况下,直接从所述写指针对应的位置,开始执行对所述故障诊断信息的写操作;在完成对所述故障诊断信息后,更新所述写指针偏移;在超过所述缓存尾的情况下,通过所述可写长度,确定所述故障诊断信息对应的第一故障诊断信息和第二故障诊断信息;所述第一故障诊断信息对应的长度和所述可写长度相同;
将所述第一故障诊断信息从所述写指针偏移开始写入到所述环形缓存;在将所述第一故障诊断信息写入所述环形缓存后,将所述第二故障诊断信息从所述环形缓存的缓存头开始写入到所述环形缓存;所述环形缓存的缓存头表征:所述环形缓存的起始;在将所述第二故障诊断信息写入所述环形缓存后,更新所述写指针偏移。
[0112] 在不超过所述缓存尾的情况下,也就是本次需要写入的故障诊断信息从写指针便宜写入的时候,不会触发环形缓存的回滚的情况下,直接执行写操作,将故障诊断信息从写指针便宜写入环形缓存。在将故障诊断信息完全写入环形缓存后,更新写指针偏移。
[0113] 在超过所述缓存尾的情况下,将本次需要写入的故障诊断信息按照环形缓存的可写长度划分为两个部分,第一故障诊断信息和第二故障诊断信息。第一故障诊断信息与环形缓存的可写长度相同,在第一故障诊断信息写入完全之后,到达环形缓存的缓存尾,触发环形缓存的回滚,之后需要写入的数据会从环形缓存的起始开始写入。
[0114] 由于本公开中在设置环形缓存的大小的时候,为了确保未读取的数据不会被新写入的数据覆盖,环形缓存的空间设定了足够大,能够保证在两次读操作的时间间隔中,写入的数据不会完全占用环形缓存的空间。
[0115] 因此,对于第二故障诊断信息,在环形缓存的回滚后,直接将第二故障诊断信息从环形缓存的缓存头开始写入,环形缓存的缓存头也就是环形缓存的起始。
[0116] 在超过所述缓存尾的情况下,需要在第二故障诊断信息完全写入环形缓存之后,更新写指针偏移。
[0117] 更新写指针偏移是为了更新写指针在环形缓存的位置,指示环形缓存中新的可写位置,在下一次写入故障诊断信息的时候,从更新后的写指针偏移开始写入。
[0118] 采用本公开的实施例,通过判断故障诊断信息是否超过缓存尾,能够动态调整写入策略,确保缓存空间得到最大化利用,在不超过缓存尾时,直接写入;在超过时,则分割信息并分别写入,避免了因空间不足而导致的写入失败或数据丢失。使用智能地管理写指针偏移,可以在缓存空间紧张时,通过分割数据并合理安排写入位置,确保了重要信息的持久保存。
[0119] 其中,在一种可选的实施例中,还可以在启动的过程中,将资产信息通过环形缓存快速传输给基板管理控制器,以减少启动时间。资产信息指的是与某个系统或设备相关的各种数据和信息,这些信息可以用来描述、管理和监控该系统或设备的状态与性能,资产信息由对应的寄存器存储。
[0120] 图2是本公开实施例示出的一种基板管理控制器端的故障诊断信息处理流程图。在基板管理控制器监测到有未读取的故障诊断信息的情况下,也就是在共享内存的读指针偏移和写指针偏移不位于共享内存的同一位置的情况下,触发基板管理控制器对环形缓存的读操作;获取到共享内存写指针偏移和读指针偏移,从读指针偏移开始读数据,大小为循环缓存中可读数据,获得故障诊断信息,更新读指针偏移;读取故障诊断信息携带的循环冗余校验值,并进行循环冗余校验,判断是否校验通过;在校验不通过的情况下,退出对故障诊断信息的解析,并生成告警日志;在校验通过的情况下,识别故障诊断信息对应的各个数据段,得到故障诊断信息对应的数据包的整体信息、各个数据段以及故障诊断信息携带的循环冗余校验值,整体信息包括命令字和数据包长度;基板管理控制器按照数据段的方式对故障诊断信息进行处理,依次完成对故障诊断信息包括的各个数据段的解析。
[0121] 图3是本公开实施例示出的一种基本输入输出系统端的故障诊断信息处理流程图。在系统出现错误并触发系统管理中断的时候,基本输入输出系统按照指定规则格式收集写入数据,并计算写入数据的循环冗余校验值;在将写入数据写入共享内存之前,判断从当前共享内存的写指针偏移处开始写入是否会超过缓存尾;在不超过缓存尾的情况下,直接将写入数据写入到共享内存,更新写指针偏移;在超过缓存尾的情况下,对写入数据按照写指针偏移到缓存尾对应的可写长度进行分段;将与可写长度对应的部分写入数据从写指针偏移写入共享内存,随后将另一部分写入数据从共享内存的缓存头写入共享内存;将写入数据完全写入共享内存后,更新写指针偏移;更新写指针偏移后,完成对写入数据的写入。
[0122] 图4是本公开实施例示出的一种架构图的示意图。包括处理器、共享内存、基本输入输出系统、基板管理控制器、终端,其中共享内存的一部分被设定为环形缓存,用于存放故障信息;在触发系统管理中断的时候,通过基本输入输出系统收集故障诊断信息,并将其接入到共享内存中的环形缓存;基板管理控制器可以直接从共享内存中的环形缓存中读取到故障诊断信息,并对故障诊断信息进行解析后,将解析结果通过告警通知终端。
[0123] 本公开实施例还提供了一种电子设备,参照图5,图5是本公开实施例示出的一种电子设备的示意图。如图5所示,电子设备500包括:存储器510和处理器520,存储器510与处理器520之间通过总线通信连接,存储器510中存储有计算机程序,该计算机程序可在处理器520上运行,进而实现本公开实施例公开故障上报方法中的步骤。
[0124] 本公开实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时,实现如本公开实施例公开的故障上报方法中的步骤。
[0125] 本公开实施例还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时,实现第一方面所述的故障上报方法的步骤本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
[0126] 本领域内的技术人员应明白,本公开实施例可提供为方法、装置或计算机程序产品。因此,本公开实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形式。
[0127] 本公开实施例是参照根据本公开实施例的方法、装置、电子设备和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0128] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0129] 这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0130] 尽管已描述了本公开实施例的部分实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本公开实施例范围的所有变更和修改。
[0131] 以上对本公开所提供的一种故障上报方法、电子设备、介质及计算机程序产品,进行了详细介绍,本文中应用了具体个例对本公开的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本公开的方法及其核心思想;同时,对于本领域的一般技术人员,依据本公开的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本公开的限制。