「探索Linux新境界——Linux kernel 4.1.10」 (linux kernel 4.1.10)

探索Linux新境界——Linux kernel 4.1.10

Linux作为一种开源的操作系统,一直以来都备受关注,因为它有着极高的爱好者数量和优秀的性能。而其中的关键组件——Linux kernel也同样受到了广泛的关注。在Linux kernel的发展历程中,每一次的更新都会引起广泛的关注,在2023年6月30日,Linux kernel 4.1.10正式发布,这个版本为开发者和用户们带来了哪些新特性呢?下面将进行探索。

1.更加完美的支持Intel Broadwell处理器

在Linux kernel 4.1.10版本中,对于Intel Broadwell处理器的支持做了更加完美的优化。板载网卡I211AT和I350T2均是新加入的硬件,相对于Linux kernel 3.19等旧版本中的处理器架构来说,Linux kernel 4.1.10充分发挥了处理器的性能优势。Intel Broadwell处理器主要是为笔记本和台式机等内置设备而设计,而其的加入则为Linux系统的性能带来了很多的提升。

2.对KVM模块的支持加强

KVM模块是一种虚拟机管理器,它的运用可以高效地在虚拟机中封装不同的操作系统。而在Linux kernel 4.1.10版本中,KVM模块得到了大力加强,特别是在虚拟网络设备、虚拟存储设备以及UEFI支持等方面都提高了其的稳定性和性能表现,因此用户在使用KVM模块时会更加顺畅和高效。

3.对加密算法的优化

Linux系统中的数据安全一直是广大用户和开发者们都非常关注的问题。而在Linux kernel 4.1.10版本中,加密算法得到了更好的优化,进一步加强了内存、SSL、hashing以及实施加密通讯等方面的安全性。这一点对于Linux系统上运行的密钥保护、安接字等方面都可以更好地呈现出强大的安全性能。

4.优化了内核碎片管理

在Linux kernel 4.1.10版本中,内核碎片管理得到了更好的优化设计。这意味着,Linux系统的内存分配更加合理,能够更有效地管理内存分配空间,从而提高Linux系统的性能表现,同时也更能够帮助保证了系统的稳定性和安全性。

5.新的驱动程序和硬件驱动支持

Linux kernel 4.1.10版本中,加入了许多新的驱动和硬件驱动支持。特别是对于现今的新设备,要想充分发挥其性能,必须借助优秀的驱动程序。而此次更新则为广大用户带来了许多的性能提升,特别是对于最新的设备,用户可以更加轻松的获得更好的性能表现。

综上所述,Linux kernel 4.1.10版本的更新主要优化了Intel Broadwell处理器的支持、加强了KVM模块的性能表现、加密算法的优化、优化了内核碎片管理的性能表现以及增加了新的驱动程序和硬件驱动支持等方面。这些新特性在Linux用户和开发者们的使用过程中都会得到更好的体现。在未来的开发中,Linux kernel还会不断地完善和进化,为用户和开发者们打造更好用的操作系统。

相关问题拓展阅读:

Linux-升级内核

Update Centos Kernel 3.10 to 5.13 latest

How to Upgrade the Linux Kernel on CentOS 7

CentOS7 Docker容器无法ping通宿主机ip问题解决记录 – 平台梦

Centos7升级内核 – 野草博客

Linux 内核升级_Andy杨的博客-CSDN博客_linux内核升级工具

升级 CentOS7.9 的内核版本 – 爱吃桔子的程序羊

注: kernel-lt-5.4.191.x86_64.tar.gz 为kernel离线rpm文件的压缩包

如何linux内核报告问题

Linux Kernel BUG:soft lockup CPU#1 stuck分析

1.线上内核bug日志

kernel: Deltaway too big!ts=write stamp =377

kernel:

kernel:WARNING: at kernel/trace/ring_buffer.c:1988 rb_reserve_next_event+0x2ce/0x370()(Not tainted)

kernel:Hardware name: ProLiant DL360 G7

kernel:Modules linked in: fuse ipv6 power_meter bnx2 sg microcode serio_raw iTCO_wdtiTCO_vendor_support hpilo hpwdt i7core_edac edac_core shpchp ext4 mbcache jbd2sd_mod crc_t10dif hpsa radeon ttm drm_kms_helper drm i2c_algo_bit i2c_coredm_mirror dm_region_hash dm_log dm_mod

kernel: Pid:5483, comm: master Not tainted 2.6.32-220.el6.x86_64 #1

kernel: CallTrace:

kernel: ? warn_slowpath_common+0x87/0xc0

kernel: ? warn_slowpath_null+0x1a/0x20

kernel: ? rb_reserve_next_event+0x2ce/0x370

kernel: ? ring_buffer_lock_reserve+0xa2/0x160

kernel: ? trace_buffer_lock_reserve+0x2c/0x70

kernel: ? trace_current_buffer_lock_reserve+0x16/0x20

kernel: ? ftrace_raw_event_hrtimer_cancel+0x4e/0xb0

kernel: ? hrtimer_try_to_cancel+0xba/0xd0

kernel: ? do_setitimer+0xd4/0x220

kernel: ? alarm_setitimer+0x3a/0x60

kernel: ? sys_alarm+0xe/0x20

kernel: ? tracesys+0xd9/0xde

kernel: ——

abrt-dump-oops: Reported 1 kernel oopses to Abrt

kernel: BUG: softlockup – CPU#11 stuck fors!

kernel:Modules linked in: fuse ipv6 power_meter bnx2 sg microcode serio_raw iTCO_wdtiTCO_vendor_support hpilo hpwdt i7core_edac edac_core shpchp ext4 mbcache jbd2sd_mod crc_t10dif hpsa radeon ttm drm_kms_helper drm i2c_algo_bit i2c_coredm_mirror dm_region_hash dm_log dm_mod

kernel: CPU 11

kernel:Modules linked in: fuse ipv6 power_meter bnx2 sg microcode serio_raw iTCO_wdtiTCO_vendor_support hpilo hpwdt i7core_edac edac_core shpchp ext4 mbcache jbd2sd_mod crc_t10dif hpsa radeon ttm drm_kms_helper drm i2c_algo_bit i2c_coredm_mirror dm_region_hash dm_log dm_mod

kernel:

kernel: Pid:5492, comm: qmgr Tainted: G W— 2.6.32-220.el6.x86_64 #1 HPProLiant DL360 G7

kernel: RIP:0010: do_setitimer+0x1d0/0x220

kernel: RSP:0018:ffff88080a661ef8 EFLAGS:

kernel: RAX:ffff88080b175a08 RBX: ffff88080a661f18 RCX:000

kernel: RDX:00 RSI:082 RDI: ffff88080c8c4c40

kernel: RBP:ffffffff8100bc0e R08:000 R09: 0099d7270e01c3f1

kernel: R10:00 R11:246 R12: ffffffff810ef9a3

kernel: R13:ffff88080a661e88 R14:000 R15: ffff88080a65a544

kernel: FS:00007f10b245f7c0(0000) GS:ffff88083c4a0000(0000) knlGS:00

kernel: CS:0010 DS: 0000 ES: 0000 CR0:03b

kernel: CR2:00007ffCR3:a80b000 CR4:6e0

kernel: DR0:00 DR1:000 DR2:000

kernel: DR3:00 DR6:ffff0ff0 DR7:400

kernel:Process qmgr (pid: 5492, threadinfo ffff88080a660000, task ffff)

kernel: Stack:

kernel:00007f10b323deff10b248eadf10b26d0ff10b248ede0

kernel: ffff88080a661f68 ffffffff8106f88a000000

kernel:14cf423d000000

kernel: CallTrace:

kernel: ? alarm_setitimer+0x3a/0x60

kernel: ? sys_alarm+0xe/0x20

kernel: ? tracesys+0xd9/0xde

kernel: Code:89 ef e83 3db49 8bfffb 66 0f 1fc0 e9 64 fe ff ff49 8bc7 80 d

kernel: CallTrace:

kernel: ? do_setitimer+0x209/0x220

kernel: ? alarm_setitimer+0x3a/0x60

kernel: ? sys_alarm+0xe/0x20

kernel: ? tracesys+0xd9/0xde

abrt-dump-oops: Reported 1 kernel oopses to Abrt

2.内核软死锁(soft lockup)bug原因分析

Soft lockup名称解释:所谓,soft lockup就是说,这个bug没有让系统彻底死机,但是若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域),很多情况下这个是由于内核锁的使用的问题。

Linux内核对于每一个cpu都有一个监控进程,在技术界这个叫做watchdog(看门狗)。通过ps –ef | grep watchdog能够看见,进程名称大概是watchdog/X(数字:cpu逻辑编号1/2/3/4之类的)。这个进程或者线程每一秒钟运行一次,否则会睡眠和待机。这个进程运行会收集每一个cpu运行时使用数据的时间并且存放到属于每个cpu自己的内核数据结构。在内核中有很多特定的中断函数。这些中断函数会调用soft lockup计数,他会使用当前的时间戳与特定(对应的)cpu的内核数据结构中保存的时间对比,如果发现当前的时间戳比对应cpu保存的时间大于设定的阀值,他就假设监测进程或看门狗线程在一个相当可观的时间还没有执。Cpu软锁为什么会产生,是怎么产生的?如果linux内核是经过精心设计安排的CPU调度访问,那么怎么会产生cpu软死锁?那么只能说由于用户开发的或者第三方软件引入,看我们服务器内核panic的原因就是qmgr进程引起。因为每一个无限的循环都会一直有一个cpu的执行流程(qmgr进程示一个后台邮件的消息队列服务进程),并且拥有一定的优先级。Cpu调度器调度一个驱动程序来运行,如果这个驱动程序有问题并且没有被检测到,那么这个驱动程序将会暂用cpu的很长时间。根据前面的描述,看门狗进程会抓住(catch)这一点并且抛出一个软死锁(soft lockup)错误。软死锁会挂起cpu使你的系统不可用。

如果是用户空间的进程或线程引起的问题backtrace是不会有内容的,如果内核线程那么在soft lockup消息中会显示出backtrace信息。

3.根据linux内核源码分析错误

根据我们之一部分内核抛出的错误信息和call trace(linux内核的跟踪子系统)来分析产生的具体原因。

首先根据我们的centos版本安装相应的linux内核源码,具体步骤如下:

(1)下载源码的rpm包kernel-2.6.32-220.17.1.el6.src.rpm

(2)安装相应的依赖库,命令:yuminstall rpm-build redhat-rpm-config asciidoc newt-devel

(3)安装源码包:rpm -ikernel-2.6.32-220.17.1.el6.src.rpm

(4)进入建立源码的目录:cd~/rpmbuild/SPECS

(5)建立生成源码目录:rpmbuild-bp –target=`uname -m` kernel.spec

下面开始真正的根据内核bug日志分析源码:

(1)之一阶段内核错误日志分析(时间在Dec 4 14:03:34这个阶段的日志输出代码分析,其实这部分代码不会导致cpu软死锁,主要是第二阶段错误日志显示导致cpu软死锁)

我们首先通过日志定位到相关源代码:看下面日志:Dec 4 14:03:34 BP-YZH-1-x kernel: WARNING: atkernel/trace/ring_buffer.c:1988 rb_reserve_next_event+0x2ce/0x370() (Not tainted)

根据日志内容我们可以很容易的定位到kernel/trace/ring_buffer.c这个文件的1988行代码如下:WARN_ON(1)。

先简单解释一下WARN_ON的作用:WARN_ON只是打印出当前栈信息,不会panic。所以会看到后面有一大堆的栈信息。这个宏定义如下:

#ifndef WARN_ON

#defineWARN_ON(condition) ({ \

int __ret_warn_on = !!(condition); \

if (unlikely(__ret_warn_on))\

__WARN();\

unlikely(__ret_warn_on); \

})

#endif

这个宏很简单保证传递进来的条件值为0或者1(两次逻辑非操作的结果),然后使用分支预测技术(保证执行概率大的分支紧邻上面的指令)判断是否需要调用__WARN()宏定义。如果满足条件执行了__WARN()宏定义也接着执行一条空指令;。上面调用WARN_ON宏是传递的1,所以会执行__WARN()。下面继续看一下__WARN()宏定义如下:

#define __WARN()warn_slowpath_null(__FILE__,__LINE__)

从接下来的call trace信息中我们也确实发现调用了warn_slowpath_null这个函数。通过在linux内核源代码中搜索这个函数的实现,发现在panic.c(内核恐慌时的相关功能实现)中实现如下:

voidwarn_slowpath_null(const char *file, int line)

{

warn_slowpath_common(file, line,__builtin_return_address(0),

TAINT_WARN, NULL);

}

EXPORT_SYMBOL(warn_slowpath_null);//都出这个符号,让其他模块可以使用这个函数

同样的我们看到了warn_slowpath_common这个函数,而在call trace当中这个函数在warn_slowpath_null函数之前打印出来,再次印证了这个流程是正确的。同样在panic.c这个文件中我发现了warn_slowpath_common这个函数的实现如下:

static voidwarn_slowpath_common(const char *file, int line, void *caller,

unsigned taint, struct slowpath_args *args)

{

const char *board;

printk(KERN_WARNING “\n”);

printk(KERN_WARNING “WARNING: at %s:%d %pS()(%s)\n”,

file, line, caller, print_tainted());

board = dmi_get_system_info(DMI_PRODUCT_NAME);//得到dmi系统信息

if (board)

printk(KERN_WARNING “Hardware name:%s\n”, board);//通过我们的日志信息可以发现我们硬件名称是ProLiant DL360 G7

if (args)

vprintk(args->fmt, args->args);

print_modules();//打印系统模块信息

dump_stack();//dump信息输出(call trace开始)

print_oops_end_marker();//打印oops结束

add_taint(taint);

}

分析这个函数的实现不难发现我们的很多日志信息从这里开始输出,包括打印一些系统信息,就不继续深入分析了(请看代码注释,里面调用相关函数打印对应信息,通过我分析这些函数的实现和我们的日志信息完全能够对应,其中dump_stack是与cpu体系结构相关的,我们的服务器应该是属于x86体系)。这里在继续分析一下dump_stack函数的实现,因为这个是与cpu体系结构相关的,而且这个函数直接反应出导致内核panic的相关进程。这个函数实现如下:

/*

* The architecture-independent dump_stackgenerator

*/

void dump_stack(void)

{

unsigned long stack;

printk(“Pid: %d, comm: %.20s %s %s %.*s\n”,

current->pid, current->comm,print_tainted(),

init_utsname()->release,

关于linux kernel 4.1.10的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 「探索Linux新境界——Linux kernel 4.1.10」 (linux kernel 4.1.10)