对于用于一线的主服务器而言,年均宕机时间是衡量其稳定性的重要指标。因此,系统出现故障后,能够尽快恢复尤其重要。在现在的高端服务器中,CPU有多个,内存容量日益增加,有的多达512G甚至达到数T容量,接入的PCIE板卡也越来越多,这极大地增加了BIOS系统自检和设备扫描的时间。此外,由于传统BIOS的设计,冷启动比热启动本身就需要多耗费几倍的时间。例如,本人在一款最新的基于Intel E5双CPU的服务器上的测试表明,冷启动到GRUB需要195秒,而热启动只需要52秒。为什么冷启动比热启动需要耗费多得多的时间?有没有哪些措施来加快BIOS启动呢?

带着这些疑问,结合之前在某国产CPU BIOS上的工作经验,仔细阅读了Intel BIOS Write Guide,有下面的一些思考和发现,希望能够起到抛砖引玉的作用。

每颗Intel E5芯片都是多核心,在BIOS启动的过程中,它会根据CPU ID和约定的机制决定哪颗CPU是Bootsrap Processor (BSP),哪颗CPU是Application Processor(AP)。通常BSP会用来做大部分的系统初设化的工作,包括初设化Cache/TLB/Memory Controler/PCIE Root complex和设备,而AP大部分时间处于等待状态,直到BSP完成主要的任务,发送核间中断来唤醒AP。事实上BSP完成的主要任务,AP也能够协助完成。对每个核而言,它自己内部的Cache、TLB都可以由自己独立初始化。连接外设上的多个PCIE Root Port和对应的卡,也可以由AP协助完成。这样一来,k个处理器器的Cache/TLB/IIO/PCIE等内部模块的初始化的时间,并发执行后可以缩减到初始化一个处理器内部Cache/TLB/IIO/PCIE的时间。

此外,在做内存控制器初始化时候,会经过内存布局扫描、控制器参数训练、内存读写自测等步骤。这个阶段,AP同样能够分担BSP控制器的工作,完成内存自检自测的工作,这就能够最大程度地并行地做系统自检和设备扫描初始化。这样一来,假设之前系统初始化需要耗时T,系统有n个处理器,并行化后,初始化的时间能够缩减到T/n。在这个阶段也可以做许多优化:

第一、仅在内存布局和序列号改变的情况下,重新训练控制器参数。内存的某些参数和具体内存型号、主板布线等相关,为了适应这些不同,第一次启动或者冷启动之后,需要经过训练这些参数才能适配具体的板卡和配置。但是在热启动的时候,如果通过Smbus/i2c检测到内存布局和型号都没有改变,可以直接使用上一次保存的参数,然后接着做后面的内存读写自测。这样就可以节省出内存参数训练的时间。对一般DDR控制器而言,内存参数训练往往占了内存初始化的大部分时间。这就要求在每次训练完DDR控制器的控制参数之后,能够把这些参数保存到非易失性存储介质上,比如flash或者eerom。因为这个时候内存并没有初始化好,堆栈无法建立起来,需要通过较复杂的汇编语言来实现读写flash/eerom。当然如果约定好了调用接口,并且有足够多的寄存器可用,这个阶段应该也可以使用基于寄存器堆栈的C语言编程实现。

第二、利用多个处理器并发执行内存自检测试。在内存初始化的一个关键步骤就是,需要执行多种模式的内存读写测试,以确保使用的内存参数能够支持多种情况下的内存读写都正确无误。传统的方法是多个测试模式逐一在CPU上运行,判断读写的值是否一致。事实上,这个阶段完全可以充分利用多核处理器的优点,同一个处理器上的其它核都可以同时分配不同的模式,然后同时执行。这样既可以验证参数的正确性,同时也是对连接到这个CPU上的DDR控制器的一个压力测试。

第三、利用多个处理器并发执行内存初始化。现在的高端服务器,不管是为了提高性能,还是为了实现Activate-Active/Active-Pass的High Availablilty,都很可能有不止一个处理器。每个处理器上有一个或多个内存控制器,都需要初始化。传统的方法是这些工作都交由BSP去做,AP只用等待其完成就好。其实,理论上每个内存控制器都可以交由多核处理器上的一个核完成,通常可以选用和内存控制器挨着较近的处理器核。这样m个内存控制器初始化的时间可以优化成接近一个内存控制器初始化的时间。

除了上述并行处理的通用方法之外,还可以根据CPU提供的特性来加快BIOS启动。有的CPU重启后,既支持从LPC Flash取指,也支持从SPI Flash取指执行。从LPC总线取指令的速度比从SPI Flash取指令的速度满很多,启动模式从LPC改成SPI就能明显加快BIOS启动。这也就是为什么现在大部分处理器都使SPI Flash取指的原因。有的CPU还支持高级的Cache的操作,能够把最近访问指令或数据的相邻指令或数据缓存到Cache中去,后面的访问都会从Cache去执行,这比从SPI Flash访问数据或者指令会块上几个数量级。最后,如果BIOS启动阶段有很多定向到慢速接口的输出(比如串口),也会明显影响BIOS启动速度,因此尽可能去掉不必要的串口输出,也会提高BIOS启动速度。

综上所述,可以通过并行化、利用CPU特性加快BIOS启动,减少系统宕机时间,提高用户体验。

转载于:https://blog.51cto.com/xiamachao/1691096

服务器中加速BIOS启动的方法相关推荐

  1. python脚本在linux上运行的两种方式_python脚本当作Linux中的服务启动实现方法

    脚本服务化目的: python 在 文本处理中有着广泛的应用,为了满足文本数据的获取,会每天运行一些爬虫抓取数据.但是网上买的服务器会不定时进行维护,服务器会被重启.这样我们的爬虫服务就无法运行.这个 ...

  2. centos 下载文件很慢_【已解决】Mac中从远程CentOS服务器中加速下载大文件

    折腾: 期间, 需要从远程的CentOS服务器中,下载一个1G多的大文件. 之前对于普通小文件,直接用命令行的sz即可下载. 现在对于大文件,需要看看是否有更好的办法. 用sz或sftp? 不过还是先 ...

  3. outlook 找不到电子邮件服务器,使用Outlook收取电子邮件并保留邮箱服务器中的邮件的设置方法...

    许多用户在使用Outlook收取电子邮件时,会发现信件统统被下载到本地计算机中,然而,当用户再次登录Web进行查信时,却会发现原邮箱被清空,所有邮件不翼而飞,这便让某些使用Outlook的用户有了顾虑 ...

  4. xampp中apache不能启动解决方法 (share)

    Xampp的获得和安装都十分简单,你只要到以下网址: http://www.apachefriends.org/zh_cn/xampp.html 下载xampp即可,我安装的是windows版本的In ...

  5. 戴尔r730xd服务器从u盘启动设置方法(戴尔r730取消网络启动方法)

    1,开机后出现提示的时候,按F12 2,等一会系统会自动进入BIOS选择菜单:选择system bios 回车 3,这时在选择boot setting 回车: 4,在这里选择 BIOS Boot se ...

  6. AWS 云服务器中kdevtmpfsi挖矿病毒处理方法

    从top 命令可以看出有一个名称为kdevtmpfsi 的进程占用cpu 特别高,高达780% 8核的cpu一个进程就占用这么多,而亚马逊云平台确显示实例运行状态正常,真是感到不可理解 1 先使用 p ...

  7. Linux 服务器(二)-linux安装方法之Centos安装介绍——Windows中制作USB启动盘 MacOS中制作USB启动盘

    Linux 服务器(二)-linux安装方法之Centos安装介绍--Windows中制作USB启动盘 & MacOS中制作USB启动盘 安装方法 Centos安装方法: 下载镜像 按需选择下 ...

  8. 服务器装系统bios设置方法,Win7需要重装系统怎么设置Bios|两种设置Bios硬盘启动的方法...

    目前Bios引导模式有Legacy+MBR(传统引导模式)和UEFI+GPT,如果设置硬盘启动的位置不对,都有可能导致系统无法启动.针对这个问题,白云一键重装系统给大家带来了两种设置Bios硬盘启动的 ...

  9. 联想服务器如何进阵列卡看型号,联想服务器怎样在BIOS中配RAID 联想服务器在BIOS中配RAID的方法...

    今天给大家带来联想服务器怎样在BIOS中配RAID,联想服务器在BIOS中配RAID的方法,让您轻松解决问题.    联想第五代服务器除了可以用"部署"功能来配置磁盘阵列外,还有一 ...

最新文章

  1. JAVA修饰符类型(public,protected,private,friendly)
  2. 社区生鲜领军者钱大妈携手神策数据,加速线上线下精准导流促增长
  3. python文件传输模块_如何将python对象从一个文件模块传递到另一个文件模块?
  4. php如何抓取网页内容,php如何抓取网页数据?
  5. 编译hbase2.2.4+hadoop3.1.2
  6. nginx服务器开启缓存、反向代理
  7. 亿佰特电源模块:无线通信模块电平转换指南
  8. hadoop单节点配置并且统计单词
  9. UML(1) - 概述
  10. 使用fastJson把对象转字符串首字母大小写问题的解决
  11. windows server 2008中IIS7的功能模塊
  12. GreenDao2.2升级GreenDao3.0的适配之路
  13. Java拥挤度,零基础学JAVA难不难?
  14. bnu 29064, 期望 水题
  15. linux 电源管理
  16. oracle数据库connectionstring,oracle数据库 connectionstring
  17. Java学习之json篇——json介绍
  18. 第11.25节 Python正则表达式编译re.compile及正则对象使用
  19. Hadoop YARN架构设计要点
  20. android布局 哪个控件在最上层_Android 在最上层添加悬浮View(兼容Android 8.0)

热门文章

  1. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
  2. linux下时间问题---date
  3. Java主线程等待所有子线程执行完毕再执行解决办法(转)
  4. MyBatis执行过程显示SQL语句的log4j配置
  5. Do a test write by windows live writer
  6. 用例子来彻底搞明白Virtual 和 非 virtual(C#)
  7. 《LeetCode力扣练习》第141题 环形链表 Java
  8. 如何用计算机画立方体,画立方体-计算机图形学实验.doc
  9. linux将字符串转小写_Python教程第10讲:字符串的使用
  10. android 游戏现状,年终总结:Android十款画面最强3D游戏