linux spin linux基础知识点

本篇文章给大家谈谈linux spin,以及linux基础知识点对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

linux硬盘检测健康状态

定期检查硬盘的健康状态是每个系统管理员必须要做的事情。说到硬盘的健康状态,这里就得先说一下S.M.A.R.T.了。

SMART是一种磁盘自我分析检测技术,早在90年代末就基本得到了普及

  每一块硬盘(包括IDE、SCSI)在运行的时候,都会将自身的若干参数记录下来

  这些参数包括型号、容量、温度、密度、扇区、寻道时间、传输、误码率等

  硬盘运行了几千小时后,很多内在的物理参数都会发生变化

  某一参数超过报警阈值,则说明硬盘接近损坏

  此时硬盘依然在工作,如果用户不理睬这个报警继续使用

  那么硬盘将变得非常不可靠,随时可能故障

SMART是和主板BIOS上相应功能配合的

  要使用SMART,必须先进入到主板BIOS设置里边启动相关设置

  一般从Pentium2级别起的主板,都支持SMART

  BIOS启动以后,就是操作系统级别的事情了

  很遗憾,Windows没有内置SMART相关工具(需要安装第三方工具软件)

  好在Linux上很早就有了SMART支持了

  如果把Linux装在VMware等虚拟机上,在系统启动时候可以看到有个服务启动报错:smartd

  这个服务器就是smart的daemon进程(因为vmware虚拟机的硬盘不支持SMART,所以报错)

可以使用下面的命令来确认硬盘是否打开了SMART支持

复制代码

  

代码如下:

smartctl-i/dev/sda

正常情况下应该会得到下面这样的信息

复制代码

  

代码如下:

[root@localhost~]# smartctl-i/dev/sda

  smartctl version 5.38 [i686-redhat-linux-gnu] Copyright(C) 2002-8 Bruce Allen

  Home page is a href="

复制代码

  

代码如下:

=== START OF INFORMATION SECTION===

  Model Family: Seagate Barracuda 7200.10 family

  Device Model: ST3160815AS

  Serial Number: 5RA6A1K9

  Firmware Version: 4.AAB

  User Capacity: 160,041,885,696 bytes

  Device is: In smartctl database [for details use:-P show]

  ATA Version is: 7

  ATA Standard is: Exact ATA specification draft version not indicated

  Local Time is: Sat Jul 7 17:18:02 2012 CST

  SMART support is: Available– device has SMART capability.

在这里,如果看到SMART support is: Disabled,则表示SMART未启用

如果我们需要执行如下命令,启动SMART:

复制代码

  

代码如下:

smartctl–smart=on–offlineauto=on–saveauto=on/dev/sda

查看硬盘当前的健康状态使用如下命令

复制代码

  

代码如下:

[root@localhost~]# smartctl-H/dev/sda

  smartctl version 5.38 [i686-redhat-linux-gnu] Copyright(C) 2002-8 Bruce Allen

  Home page is a href="

复制代码

  

代码如下:

=== START OF READ SMART DATA SECTION===

  SMART overall-health self-assessment test result: PASSED

请注意result后边的结果:PASSED,这表示硬盘健康状态良好

  如果这里显示Failure,那么最好立刻给服务器更换硬盘。

执行如下命令可以看到详细的参数:

复制代码

  

代码如下:

[root@localhost~]# smartctl-A/dev/sda

  smartctl version 5.38 [i686-redhat-linux-gnu] Copyright(C) 2002-8 Bruce Allen

  Home page is a href="

复制代码

  

代码如下:

=== START OF READ SMART DATA SECTION===

  SMART Attributes Data Structure revision number: 10

  Vendor Specific SMART Attributes with Thresholds:

  ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE

  1 Raw_Read_Error_Rate 0x000f 100 253 006 Pre-fail Always– 0

  3 Spin_Up_Time 0×0003 097 097 000 Pre-fail Always– 0

  4 Start_Stop_Count 0×0032 100 100 020 Old_age Always– 818

  5 Reallocated_Sector_Ct 0×0033 100 100 036 Pre-fail Always– 0

  7 Seek_Error_Rate 0x000f 085 060 030 Pre-fail Always– 369003829

  9 Power_On_Hours 0×0032 084 084 000 Old_age Always– 14527

  10 Spin_Retry_Count 0×0013 100 100 097 Pre-fail Always– 0

  12 Power_Cycle_Count 0×0032 100 100 020 Old_age Always– 817

  187 Reported_Uncorrect 0×0032 100 100 000 Old_age Always– 0

  189 High_Fly_Writes 0x003a 100 100 000 Old_age Always– 0

  190 Airflow_Temperature_Cel 0×0022 052 046 045 Old_age Always– 48(Lifetime Min/Max 47/52)

  194 Temperature_Celsius 0×0022 048 054 000 Old_age Always– 48(0 11 0 0)

  195 Hardware_ECC_Recovered 0x001a 074 062 000 Old_age Always– 188295533

  197 Current_Pending_Sector 0×0012 100 100 000 Old_age Always– 0

  198 Offline_Uncorrectable 0×0010 100 100 000 Old_age Offline– 0

  199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always– 0

  200 Multi_Zone_Error_Rate 0×0000 100 253 000 Old_age Offline– 0

  202 TA_Increase_Count 0×0032 100 253 000 Old_age Always– 0

上边列出的参数表中可供进行技术分析和参考,使用下边的命令可以输出完整结果:

复制代码

  

代码如下:

smartctl-a/dev/sda

spinlock(linux kernel 自旋锁)

在Linux内核的世界里,自旋锁spinlock犹如守护者,守护着数据的临界区,确保并发访问的有序性。它不依赖于睡眠,而是通过连续的CPU循环来尝试获取锁,这在中断处理和进程上下文中表现出了极高的效率,但也可能造成CPU资源的浪费。自旋锁有三种主要实现方式:CAS(Compare and Swap)模式,简单直接但竞争随机;Ticket模式,引入公平性但消耗CPU;而MCS(Multi-CPU Scalable)模式,是对Ticket模式的优化,通过链表通知减少了CPU空转,实现了更高的效率与内存利用。

在Linux内核的广泛应用中,自旋锁的性能优化尤为重要,尤其是在多线程竞态的极端场景。例如,MCS模式虽然牺牲了一定的内存使用,但其高效性能使之成为首选。特别是针对内存密集型的应用,qspinlock的出现,通过一个32位原子变量巧妙地管理locked、pending和tail,实现了内存节省和高效操作。然而,这种复杂性也意味着在编写和维护时需要更加谨慎。

要使用自旋锁,只需在spinlock.h>中引入相关头文件,定义spinlock并调用spin_lock、spin_unlock进行加锁解锁。举个实例,当处理中断和进程混合的并发任务时,spinlock能够确保数据的一致性。内核提供了多种API,如spin_lock, spin_unlock用于无中断操作,spin_lock_irq, spin_unlock_irq则避免了中断的嵌套,spin_is_locked函数则用于检查锁的状态。

源代码的精髓隐藏在kernel\locking\spinlock.c和qspinlock.c中,头文件位于include\linux\spinlock.h。最新的Linux kernel 5.16.5 stable tree中包含了这些实现。深入研究源码,你会发现自旋锁的实现层次结构,从spin_lock到do_raw_spin_trylock,再到arch_spin_trylock,映射着qspinlock等优化方案。

对于内核开发者来说,自旋锁的优化是一个动态发展的领域,新的解决方案可能会不断涌现。想要深入了解,不妨关注我们的专业专栏RTFSC(Linux kernel源码轻松读),这里有丰富的原创内容,助你探索更深层次的内核世界。

系统调用里为什么没法用spin

spin_lock_bh通常用在进程中,用来禁止抢断和禁止软中断。

spin_lock_bh()中首先会调用local_bh_disable()禁止当前CPU的软件中断。而函数spin_unlock_bh()则调用local_bh_enable()来势能本地CPU的软件中断。在软件中断被禁止的时候,本地CPU的所有软中断都不会被执行。

如果一个softirq与用户上下文共享数据,就有两个问题:首先,当前的用户上下文可能被softirq中断;其次,临界区可能会在别的CPU进入。这时spin_lock_bh()(include/linux/spinlock.h)就有了用武之地。它会在那个CPU上禁止softirqs,然后获

取锁。spin_unlock_bh()做相反的工作。(由于历史原因,后缀‘bh’成为对各种下半部的通称,后者是software interrupts的旧称。其实spin_lock_bh本应叫作spin_lock_softirq才贴切),注意这里你也可以用spin_lock_irq()或者spin_lock_irqsave(),这样不单会禁止softirqs,还会禁止硬件中断。

tasklets和timer其实是一种softirq,从加锁观点来看,tasklets和timers的地位是等同的。

硬中断通常与一个tasklet或softirq通信。这通常涉及到把一个任务放到某个队列中,再由softirq取出来。如果一个硬件中断服务例程与一个softirq共享数据,就有两点需要考虑。第一,softirq的执行过程可能会被硬件中断打断;第二,临界区可能会被另一个CPU上的硬件中断进入。这正是spin_lock_irq()派上用场的地方。它在那个CPU上禁止中断,然后获取锁。spin_unlock_irq()做相反的工作。

硬件中断服务例程中不需要使用spin_lock_irq(),因为当它在执行的时候softirq是不可能执行的:它可以使用spin_lock(),这个会更快一些。唯一的例外是另一个硬件中断服务例程使用了相同的锁:spin_lock_irq()会禁止那个硬件中断。

阅读剩余
THE END