linux 内核 xfs ail,linux 3.10内核 xfs的一次io异常导致的hung crash

8556395.925003] XFS (sdi): xfs_log_force: error -5returned.

[8556407.425047] INFO: task umount:19286 blocked for more than 1200seconds.----这个默认是120,该环境上是被人为设置1200

[8556407.425653] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables thismessage.

[8556407.426050] umount D ffff881fffdd47c0 0 19286 19283 0x00000080------------------------19286是pid,19283是ppid

[8556407.426056] ffff883e39587d80 0000000000000082ffff883e39587fd8 ffff883e39587fd8

[8556407.426066] ffff883e39587fd8 00000000000147c0 ffff881fd3260000 ffff881f860fec80

[8556407.426072] ffff883ed79e1a20 ffff881f860fecc0 ffff881f860fece8 ffff881f860fec90------------这12个64位的值为栈里的值

[8556407.426078] Call Trace:

[8556407.426092] [] schedule+0x29/0x70[8556407.426137] [] xfs_ail_push_all_sync+0xc1/0x110[xfs]

[8556407.426143] [] ? wake_up_atomic_t+0x30/0x30[8556407.426165] [] xfs_unmountfs+0x68/0x190[xfs]

[8556407.426186] [] ? xfs_mru_cache_destroy+0x6b/0x90[xfs]

[8556407.426204] [] xfs_fs_put_super+0x32/0x90[xfs]

[8556407.426211] [] generic_shutdown_super+0x56/0xe0-------已经执行完fsnotify_umount_inodes[8556407.426215] [] kill_block_super+0x27/0x70[8556407.426218] [] deactivate_locked_super+0x49/0x60[8556407.426222] [] deactivate_super+0x46/0x60[8556407.426229] [] mntput_no_expire+0xc5/0x120[8556407.426234] [] SyS_umount+0x15b/0x5b0[8556407.426239] [] system_call_fastpath+0x16/0x1b[8556407.426242] sending NMI to all CPUs:

对应的函数为:

/** Push out all items in the AIL immediately and wait until the AIL is empty.*/

voidxfs_ail_push_all_sync(struct xfs_ail *ailp)

{struct xfs_log_item *lip;

DEFINE_WAIT(wait);

spin_lock(&ailp->xa_lock);while ((lip = xfs_ail_max(ailp)) !=NULL) {

prepare_to_wait(&ailp->xa_empty, &wait, TASK_UNINTERRUPTIBLE);

ailp->xa_target = lip->li_lsn;

wake_up_process(ailp->xa_task);

spin_unlock(&ailp->xa_lock);

schedule();

spin_lock(&ailp->xa_lock);

}

spin_unlock(&ailp->xa_lock);

finish_wait(&ailp->xa_empty, &wait);

}

排查的时候走了弯路,因为看的是:

crash> dis -l xfs_ail_push_all_sync+0xc1

/usr/src/debug/kernel-3.10.0-327.22.2.el7/linux-3.10.0-327.22.2.el7.x86_64/include/linux/spinlock.h: 293

0xffffffffa07c6cd1 193>: mov %r13,%rdi

所以想当然地认为在第一个 获取spinlock的地方,

spin_lock(&ailp->xa_lock);---------以为在这hung住while ((lip = xfs_ail_max(ailp)) != NULL) {

然后查找这把锁:

crash> structsuper_block.s_fs_info ffff883f7fe67800

s_fs_info= 0xffff883f7fe67000crash> mod -s xfs

MODULE NAME SIZE OBJECT FILE

ffffffffa0803d40 xfs939714 /lib/modules/3.10.0-327.22.2.el7.x86_64/kernel/fs/xfs/xfs.ko

crash> struct -xo xfs_mount.m_ail 0xffff883f7fe67000

structxfs_mount {

[ffff883f7fe67010]struct xfs_ail *m_ail;

}struct xfs_mount.m_ail 0xffff883f7fe67000m_ail= 0xffff881f860fec80crash> struct -xo xfs_ail.xa_lock 0xffff881f860fec80

structxfs_ail {

[ffff881f860fecc0] spinlock_t xa_lock;

}

而且这把锁的值是:

crash> struct xfs_ail.xa_lock 0xffff881f860fec80xa_lock={

{

rlock={

raw_lock={

{

head_tail= 2406518640,

tickets={

head= 36720,

tail= 36720}

}

}

}

}

}

我一看到这个是非0值,想当然认为是被持有了,为了验证我的想法,我甚至随便找了一把锁查看它的值,点背的时候,喝凉水都塞牙,我随手选择的锁是:

crash>p gc_lock

gc_lock= $1 ={

{

rlock={

raw_lock={

{

head_tail= 0,

tickets={

head= 0,

tail= 0}

}

}

}

}

}

后来仔细看了在没有开启 CONFIG_QUEUED_SPINLOCKS 的情况下,锁的定义才是如此,否则的话,是如下:

#ifndef __GENKSYMS__

typedefstructqspinlock {

atomic_t val;

} arch_spinlock_t;#elsetypedef u32 __ticketpair_t;

typedefstructarch_spinlock {

union {

__ticketpair_t head_tail;struct__raw_tickets {

__ticket_t head, tail;

} tickets;

};

} arch_spinlock_t;#endif

所以要么0,要么1的情况只适合于第一种定义,以前因为业务默认配置的config问题,查的锁相关的crash,大多是第一种定义,但是当时没注意到这个细节,只是简单扫了一眼,浪费我两个小时,所以下盘不稳总会摔。

查看running状态的都没有持有这把锁,(其实按照第二种定义,是正常的,因为此时本就没人持有这把锁,因为head和tail相等)比较奇怪,后来找同事讨论,同事认为是while循环没跳出,所以获取锁的那行是schedule下面那行,还没有执行。

想起来自己曾经写过的博客《https://www.cnblogs.com/10087622blog/p/9558024.html》,应该是如此

voidxfs_ail_push_all_sync(struct xfs_ail *ailp)

{struct xfs_log_item *lip;

DEFINE_WAIT(wait);

spin_lock(&ailp->xa_lock);while ((lip = xfs_ail_max(ailp)) !=NULL) {

prepare_to_wait(&ailp->xa_empty, &wait, TASK_UNINTERRUPTIBLE);

ailp->xa_target = lip->li_lsn;

wake_up_process(ailp->xa_task);

spin_unlock(&ailp->xa_lock);

schedule();--------------------这个和while循环一直跳不出去,

spin_lock(&ailp->xa_lock);

}

spin_unlock(&ailp->xa_lock);

finish_wait(&ailp->xa_empty, &wait);

}

跳不出去的原因跟io相关,也就是wake_up 相关的内核线程之后,内核线程还是没有完成对应的任务:

crash> struct xfs_ail.xa_task 0xffff881f860fec80xa_task= 0xffff883f8901dc00crash> task_struct.pid 0xffff883f8901dc00pid= 42726crash> set 42726PID:42726COMMAND:"xfsaild/sdi"TASK: ffff883f8901dc00 [THREAD_INFO: ffff881f3d828000]

CPU:17STATE: TASK_INTERRUPTIBLE

crash>bt

PID:42726 TASK: ffff883f8901dc00 CPU: 17 COMMAND: "xfsaild/sdi"#0[ffff881f3d82bcd0] __schedule at ffffffff8163df9b

#1[ffff881f3d82bd38] schedule at ffffffff8163e879

#2[ffff881f3d82bd48] schedule_timeout at ffffffff8163c295

#3[ffff881f3d82bdf8] xfsaild at ffffffffa07c6a4f [xfs]

#4[ffff881f3d82bec8] kthread at ffffffff810a661f

#5 [ffff881f3d82bf50] ret_from_fork at ffffffff81649858

xfsaild 无法完成的原因也是因为IO异常:

附部分相关io异常的message日志:

kernel: sd 5:0:8:0: [sdi] CDB: Read(16) 88 00 00 00 00 00 03 4c b0 48 00 00 00 08 00 00kernel: sd5:0:8:0: [sdi] CDB: Read(16) 88 00 00 00 00 00 15 32 8a 50 00 00 03 30 00 00kernel: blk_update_request: I/O error, dev sdi, sector 355634560kernel: sd5:0:8:0: rejecting I/O to offline device

kernel: XFS (sdi): metadata I/O error: block 0xee173de0 ("xfs_trans_read_buf_map") error 5 numblks 8kernel: XFS (sdi): metadata I/O error: block 0x15da29d90 ("xfs_trans_read_buf_map") error 5 numblks 32kernel: sd5:0:8:0: rejecting I/O to offline device

kernel: XFS (sdi): xfs_imap_to_bp: xfs_trans_read_buf() returned error-5.

kernel: XFS (sdi): metadata I/O error: block 0xeca8a480 ("xfs_trans_read_buf_map") error 5 numblks 8kernel: sd5:0:8:0: rejecting I/O to offline device

kernel: sd5:0:8:0: rejecting I/O to offline device

对应的bug解决可以参照:https://bugzilla.redhat.com/show_bug.cgi?id=1267042

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql statements_Postgresql监控sql模块之pg_stat_statements模块--部署篇

概述今天主要介绍一下PG一个很重要的模块--pg_stat_statements模块,对于做性能观察还是很不错的。一、pg_state_statements模块简介1、简介pg_stat_statements模块提供一种方法追踪一个服务器所执行的所有 SQL 语句的执行统计信息,可以用于统计数据库的资…

vscode 文件夹中查找_VSCode 多文件搜索和替换

本文目录结构VSCode 多文件搜索和替换虽然在“基础入门”这个部分中,我们一直都在介绍编辑器的各种功能,但是,为了把搜索这样的一个功能介绍完整,我们今天就再讲一下在 VS Code 当中如何使用多文件搜索。关于 VSCode 单文件搜索和…

linux服务配置大全 fedora 8 ftp 百度文库,Linux下VSFTP配置全攻略

Linux下VSFTP配置全攻略[日期:2007-10-05]来源:Linux公社作者:Linuxidc[字体:大 中 小]4]如果要以系统中存在的普通用户登入FTP,也没有什么可以设置的,添加一个用户就行。比如我要添加beinan这个用户&#…

collector list 多个分组_Java 8嵌套(多级)分组依据

您不能通过多个键对单个项目进行分组,除非您接受该项目可能会出现在多个组中。在这种情况下,您想要执行一种flatMap操作。实现此目的的一种方法是Stream.flatMap与临时对一起使用,以容纳和的组合,Item然后SubItem再进行收集。由于…

sqlserver 还原bak文件 查看不到_SQL server中用T-SQL语句实现(建库,分离,附加,备份,还原)...

会用图形界面创建后,今天可以学习用T-SQL来创建数据库及对数据库的操作。一. T-SQL 创建数据库--创建数据库create database MySchool--创建数据库 数据库名称MySchoolon primary(--创建主数据库文件nameMySchool_data,--主数据库文件名称fileNameD:MySchool_data.m…

win7变成linux桌面背景,教大家把Ubuntu界面改造成Windows7系统

经常使用windows7系统的用户可能比较喜欢windows7系统强大的系统界面,下面就教大家如何使Ubuntu看起来像Windows 7系统的界面,具体内容如下所述,Ubuntu自身拥有相当不错的主题系统、视觉效果和养眼的画面,但你可能喜欢windows7的A…

深交所a股证券代码_深市和沪市的股票代码应该怎么区别?

展开全部深市和沪市的股票代码的区别如下:1、沪市A股票买卖的代32313133353236313431303231363533e78988e69d8331333365666266码是以600或601打头,如:运盛实业,股票代码是600767,中国国航(7.72,0.32,4.32%)是601111。B…

怎么通过MQTT查看数据是否上云端_设备工程师们的福利来啦!JSON数据采集网关帮你实现云端对接~...

JSON数据采集网关是一种能够将各种传感器的数据采集后按照JSON格式上传服务器的网关。图 JSON数据采集网关工作原理示意图JSON(JavaScript Object Notation)是java中的数据格式。例如{“power”:”100”, “time”:”10:12:23”}这样的格式,由于它简单易用&#xff…

小爱音响调用php接口_PHP调用语音合成接口

百度TTS 语音合成//百度文件转换成语音private function toSpeech($text){define(DEMO_CURL_VERBOSE, false);$obj["status">0,"msg">"","file_name">""];//获取秘钥$apiKey Config::get(apiKey);$secretKey Con…

oracle 会话数上不去_Oracle初识

1、基本概念oracle数据库是一个物理概念,oracle实例是数据库在内存中的镜像,属于一种逻辑概念。oracle数据库与oracle实例至少是一对一的关系,也可能是一对多关系(oracle集群:RAC real application cluster&#xff09…

trace Linux and实例,traceroute在linux中的使用方法

traceroute在linux中的使用方法一、traceroute的实现原理1、IP协议利用存活时间TTL来发出探测包跟踪数据包到达目标ip主机所经历的路由网关数量,每经过一个路由器,TTL的值就减去1。当TTL值为0时,主机就取消发送数据包,并回传一份I…

js 点击闭包_学习Javascript闭包(Closure)

讲的很清楚明了,连我都懂了,要是我们大学时的老师也能这么讲课。。。他们只会放幻灯片2009年8月30日 22:29| #| 引用2009年8月30日 22:44| #| 引用呵呵,可以作为面试题了!2009年8月31日 09:30| #| 引用十三说:闭包个人…

在VS中怎么用vb画矩形_(十四)矩形和操作展示逻辑操作

时间为友,记录点滴。聊了这么多的图片运算,忽然有个想法,为什么非要用静态的图片来展示运算呢?我们可以用自己做的图片来经过运算后显示出来。说干就干。先想一下需求:整体环境非黑即白。可以用鼠标在背景上画出矩形&a…

linux文件传输到另一台linux,使用scp将文件/目录拷贝到另一台Linux主机上

如何将一台Linux主机上的文件或目录拷贝到另一台Linux主机上,scp命令可以实现该需求前提条件:两台Linux主机处于同一网段,可以互相ping通操作如下:文件拷贝①将本地文件拷贝到远端主机上scp 待拷贝的文件 远端主机用户名远端主机I…

python结构化数据_python新手入门必备—— 使用json保存结构化数据

【摘要】使用 json 保存结构化数据时,字符串可以很轻松地写入文件并从文件中读取出来。数字可能会费点劲,因为 read() 方法只能返回字符串,这些字符串必须传递给类似 int() 的函数,它会接受类似 123 这样的字符串并返回其数字值 1…

c++ 二维数组 排序_漫画:“排序算法” 大总结

​冒泡排序:漫画:什么是冒泡排序?​mp.weixin.qq.com选择排序:漫画:什么是选择排序?​mp.weixin.qq.com插入排序:漫画:什么是插入排序?​mp.weixin.qq.com此外还有冒泡排…

c语言线程经常段错误的是,由pthread_create引起的段异常

由pthread_create引起的段错误一般线程的结束是由进程内的其他线程来结束的,调用pthread_cancel.但是需要考虑到被结束线程的性质,一方面,线程是可被结束,也可无法结束,即不响应该信号;另一方面&#xff0c…

python request url编码_Python 爬虫 (requests) 发送中文编码的 HTTP POST 请求

向往常一样发送POST请求出现错误网站信息表单页面结果网页使用 gb2312 编码使用 requests 发送 post 请求In [2]: import requestsIn [3]: from bs4 import BeautifulSoup as BSIn [4]: url http://example.com/ip/search.aspIn [5]: data {...: loudong: 女生九栋,...: fang…

python坐标定位_如何利用Python识别并定位图片中某一个色块的坐标?

依赖python包|opencv、numpy、aircv 第一步:查找图片在原始图片上的坐标点 import aircv as ac def matchImg(imgsrc,imgobj,confidencevalue0.5):#imgsrc原始图像,imgobj待查找的图片 imsrc ac.imread(imgsrc) imobj ac.imread(imgobj) match_result …

centos7打开图形界面命令_centos7标准版(DVD)命令界面和图形界面相互切换

1、root登陆终端2、输入命令 vi /etc/inittab ,查看两种界面的启动模式:vi /etc/inittab3、退出vi模式,,输入命令systemctl get-default 查看当前系统启动模式;我的是命令界面模式为:multi-user.target;4、…