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()会禁止那个硬件中断。