SSD 因 NCQ hang,failed command: WRITE FPDMA QUEUED / tag 28 ncq 4096 out

新购入的建兴ZETA 256G,在CentOS 7.2中,用PostgreSQL自带的fsync测试工具pg_test_fsync测试IOPS时,突然IO hang住了。

dmesg报了一堆这样的超时:

         res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  895.604149] ata1.00: status: { DRDY }
[  895.606940] ata1.00: failed command: WRITE FPDMA QUEUED
[  895.609389] ata1.00: cmd 61/08:e0:38:bd:06/00:00:00:00:00/40 tag 28 ncq 4096 out
         res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  895.614144] ata1.00: status: { DRDY }
[  895.616516] ata1.00: failed command: WRITE FPDMA QUEUED
[  895.618665] ata1.00: cmd 61/10:e8:00:90:06/02:00:00:00:00/40 tag 29 ncq 270336 out
         res 40/00:01:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  895.622940] ata1.00: status: { DRDY }
[  895.625089] ata1.00: failed command: WRITE FPDMA QUEUED
[  895.627236] ata1.00: cmd 61/00:f0:00:8c:06/04:00:00:00:00/40 tag 30 ncq 524288 out
         res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  895.631176] ata1.00: status: { DRDY }
[  895.633133] ata1: hard resetting link
[  895.937682] ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
[  895.940816] ata1.00: ACPI cmd ef/10:03:00:00:00:a0 (SET FEATURES) filtered out
[  895.940830] ata1.00: ACPI cmd f5/00:00:00:00:00:a0 (SECURITY FREEZE LOCK) filtered out
[  895.941234] ata1.00: ACPI cmd ef/10:03:00:00:00:a0 (SET FEATURES) filtered out
[  895.941243] ata1.00: ACPI cmd f5/00:00:00:00:00:a0 (SECURITY FREEZE LOCK) filtered out
[  895.941314] ata1.00: configured for UDMA/133
[  895.941356] ata1.00: device reported invalid CHS sector 0
[  895.941362] ata1.00: device reported invalid CHS sector 0
[  895.941366] ata1.00: device reported invalid CHS sector 0
[  895.941369] ata1.00: device reported invalid CHS sector 0
[  895.941374] ata1.00: device reported invalid CHS sector 0
[  895.941377] ata1.00: device reported invalid CHS sector 0
[  895.941381] ata1.00: device reported invalid CHS sector 0
[  895.941384] ata1.00: device reported invalid CHS sector 0
[  895.941388] ata1.00: device reported invalid CHS sector 0
[  895.941392] ata1.00: device reported invalid CHS sector 0
[  895.941395] ata1.00: device reported invalid CHS sector 0
[  895.941399] ata1.00: device reported invalid CHS sector 0
[  895.941403] ata1.00: device reported invalid CHS sector 0
[  895.941408] ata1.00: device reported invalid CHS sector 0
[  895.941434] ata1: EH complete

现象和网上描述的类似,很多SSD有这样的问题。

https://bugzilla.kernel.org/show_bug.cgi?id=15573

https://communities.intel.com/thread/77801?start=0&tstart=0

http://www.cnblogs.com/welhzh/p/4469206.html

http://patchwork.ozlabs.org/patch/49365/

建议关闭ncq。

什么是NCQ?

http://baike.baidu.com/view/17501.htm

NCQ(Native Command Queuing,全速命令队列)是被设计用于改进在日益增加的负荷情况下硬盘的性能和稳定性的技术。当用户的应用程序发送多条指令到用户的硬盘,NCQ硬盘可以优化完成这些指令的顺序,从而降低机械负荷达到提升性能的目的。 NCQ技术是一种使硬盘内部优化工作负荷执行顺序,通过对内部队列中的命令进行重新排序实现智能数据管理,改善硬盘因机械部件而受到的各种性能制约。

貌似对SSD没什么用,所以是SSD的话,可以关闭它。

查看了一下,装载ncq的信息如下:

# dmesg|gerp ncq

[    4.157792] ahci 0000:00:1f.2: flags: 64bit ncq sntf ilck pm led clo pio slum part ems apst 

解决办法:

禁用ncq,启动项中加入libata.force=noncq

[root@digoal ahci]# vi /etc/default/grub 

GRUB_CMDLINE_LINUX="rhgb quiet libata.force=noncq"

重启。

或者修改/boot/grub2/grub.cfg   加到rhgb quiet后面

libata.force=noncq 

(如果我有机械盘,又有SSD,怎么处理呢?)

(机械盘需要ncq,而SSD不需要NCQ。)

(此时需要patch libata的代码才行,针对硬盘型号来处理。)

针对不同的盘设置不同的queue_depth,设置为1和禁用ncq功能相当。

Disabling ncq by putting the following in /etc/conf.d/local.start.
echo 1 > /sys/block/sdX/device/queue_depth 

解释一下  libata.force=noncq  

通过查看libata的模块信息

[root@digoal ~]# modinfo libata
filename:       /lib/modules/3.10.0-327.el7.x86_64/kernel/drivers/ata/libata.ko
version:        3.00
license:        GPL
description:    Library module for ATA devices
author:         Jeff Garzik
rhelversion:    7.2
srcversion:     042B7B276FD3988FFBEFB88
depends:
intree:         Y
vermagic:       3.10.0-327.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        79:AD:88:6A:11:3C:A0:22:35:26:33:6C:0F:82:5B:8A:94:29:6A:B3
sig_hashalgo:   sha256
parm:           acpi_gtf_filter:filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock, 0x4=DIPM, 0x8=FPDMA non-zero offset, 0x10=FPDMA DMA Setup FIS auto-activate) (int)
parm:           force:Force ATA configurations including cable type, link speed and transfer mode (see Documentation/kernel-parameters.txt for details) (string)
parm:           atapi_enabled:Enable discovery of ATAPI devices (0=off, 1=on [default]) (int)
parm:           atapi_dmadir:Enable ATAPI DMADIR bridge support (0=off [default], 1=on) (int)
parm:           atapi_passthru16:Enable ATA_16 passthru for ATAPI devices (0=off, 1=on [default]) (int)
parm:           fua:FUA support (0=off [default], 1=on) (int)
parm:           ignore_hpa:Ignore HPA limit (0=keep BIOS limits, 1=ignore limits, using full disk) (int)
parm:           dma:DMA enable/disable (0x1==ATA, 0x2==ATAPI, 0x4==CF) (int)
parm:           ata_probe_timeout:Set ATA probing timeout (seconds) (int)
parm:           noacpi:Disable the use of ACPI in probe/suspend/resume (0=off [default], 1=on) (int)
parm:           allow_tpm:Permit the use of TPM commands (0=off [default], 1=on) (int)
parm:           atapi_an:Enable ATAPI AN media presence notification (0=0ff [default], 1=on) (int)

看到有一个force参数,它提示详见内核文档。

[root@digoal ~]# less /usr/share/doc/kernel-doc-3.10.0/Documentation/kernel-parameters.txt

找到了对应的解释

        libata.force=   [LIBATA] Force configurations.  The format is comma
                        separated list of "[ID:]VAL" where ID is
                        PORT[.DEVICE].  PORT and DEVICE are decimal numbers
                        matching port, link or device.  Basically, it matches
                        the ATA ID string printed on console by libata.  If
                        the whole ID part is omitted, the last PORT and DEVICE
                        values are used.  If ID hasn't been specified yet, the
                        configuration applies to all ports, links and devices.

                        If only DEVICE is omitted, the parameter applies to
                        the port and all links and devices behind it.  DEVICE
                        number of 0 either selects the first device or the
                        first fan-out link behind PMP device.  It does not
                        select the host link.  DEVICE number of 15 selects the
                        host link and device attached to it.

                        The VAL specifies the configuration to force.  As long
                        as there's no ambiguity shortcut notation is allowed.
                        For example, both 1.5 and 1.5G would work for 1.5Gbps.
                        The following configurations can be forced.

                        * Cable type: 40c, 80c, short40c, unk, ign or sata.
                          Any ID with matching PORT is used.

                        * SATA link speed limit: 1.5Gbps or 3.0Gbps.

                        * Transfer mode: pio[0-7], mwdma[0-4] and udma[0-7].
                          udma[/][16,25,33,44,66,100,133] notation is also
                          allowed.

                        * [no]ncq: Turn on or off NCQ.  # 和本文相关的部分。

                        * nohrst, nosrst, norst: suppress hard, soft
                          and both resets.

                        * rstonce: only attempt one reset during
                          hot-unplug link recovery

                        * dump_id: dump IDENTIFY data.

                        * atapi_dmadir: Enable ATAPI DMADIR bridge support

                        * disable: Disable this device.

                        If there are multiple matching configurations changing
                        the same attribute, the last one is used.

模块参数也可以在这里查看。

[root@digoal ~]# cd /sys/module/libata/parameters/
[root@digoal parameters]# ll
total 0
-rw-r--r-- 1 root root 4096 Dec 20 21:17 acpi_gtf_filter
-r--r--r-- 1 root root 4096 Dec 20 21:17 allow_tpm
-r--r--r-- 1 root root 4096 Dec 20 21:17 atapi_an
-r--r--r-- 1 root root 4096 Dec 20 21:17 atapi_dmadir
-r--r--r-- 1 root root 4096 Dec 20 21:17 atapi_enabled
-r--r--r-- 1 root root 4096 Dec 20 21:17 atapi_passthru16
-r--r--r-- 1 root root 4096 Dec 20 21:17 ata_probe_timeout
-r--r--r-- 1 root root 4096 Dec 20 21:17 dma
-r--r--r-- 1 root root 4096 Dec 20 21:17 fua
-rw-r--r-- 1 root root 4096 Dec 20 21:17 ignore_hpa
-r--r--r-- 1 root root 4096 Dec 20 21:17 noacpi
时间: 2024-10-02 05:09:10

SSD 因 NCQ hang,failed command: WRITE FPDMA QUEUED / tag 28 ncq 4096 out的相关文章

chromium nacl编译出错

问题描述 chromium nacl编译出错 FAILED: Command '........outDebuggensdkwin_x86pnacl_newlibbinpnacl-ar @c:usersadmini~1.??appdatalocaltemptmpz8nl6n' returned non-zero exit stat us 1 [4/14478] ACTION nacl_lib_newlib: buil... plib_3ee1b6ebff4793d51aee0961182f8cb

开启AHCI模式 - 提升Windows 7运行速度

和以前使用Windows XP一样,很多用户都在设法提高Windows7的系统运行速速,比较常见的方法大多是对系统服务进行优化,去掉一些可有可无的系统服务,还有就是优化资源管理器菜单等.除此之外,还有一些"不常见的偏方",据说也可以让Windows 7的运行速度快上一倍. 如果你想尝试本文分享的方法,让你的Windows 7系统运行速度快起来,首先,你要保证你的主板支持AHCI. 如果你的主板支持AHCI,那么请在安装Windows7前进入Bios设置,在Advanced选项中将SAT

命令行的艺术:linux bash命令大全详解

熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力.本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要.有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂.这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了. 这篇文章是 许多作者和译者 共同的成果. 这里的部分内容 首次 出现 于 Quora , 但已经迁移到了 Github,并由众多高手做出了许多改进. 如果你在本文中发现了错误或者存

Linux基础命令介绍十五:推陈出新

本文介绍ip.ss.journalctl和firewall-cmd,它们旨在代替linux中原有的一些命令或服务. 1.ip ip [OPTIONS] OBJECT COMMAND  ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig.route等,使用权限为超级用户. OPTIONS是修改ip行为或改变其输出的选项. OBJECT是要获取信息的对象.包括: address   表示设备的协议(IPv4或IPv6)地址  link  

MySQL Master High Available 实战篇

测试背景 以下所有测试,全部基于以下复制结构完成 host_1(host_1:3306) (current master) +--host_2(host_2:3306) +--host_3(host_3:3306) 一.MHA安装 mha node 所有服务器节点都要安装 mha manager 只需要安装在manager节点 MHA NODE 1. yum install perl-DBD-MySQL 2. rpm -ivh mha4mysql-node-0.56-0.el6.noarch.r

电脑越用越慢怎么办?电脑运行慢解决方法

最近总是感觉自己的电脑越来越慢.于是想优化一下,可是普通的软件优化已经达到了极限,精简系统又不是我的风格.于是开始像硬件方面去找找问题.于是发现了个好东西--AHCI. AHCI(Serial ATA Advanced Host Controller Interface)串行ATA高级主控接口/高级主机控制器接口),是在Intel的指导下,由多家公司联合研发的接口标准,它允许存储驱动程序启用高级串行 ATA 功能,如本机命令队列和热插拔,其研发小组成员主要包括Intel.AMD.戴尔.Marve

sp_MSforeachtable 与 sp_MSforeachdb

原文 sp_MSforeachtable 与 sp_MSforeachdb 在MSSQL里有许多不公开的系统存储过程,其中可能常用的sp_MSforeachtable和sp_MSforeachdb有这2个.分别用于遍历某数据库的每个用户表.每个数据库.  sp_MSforeachtable  create proc sp_MSforeachtable    @command1 nvarchar(2000),             --第一条运行的T-SQL     @replacechar n

oVirt 3.4.3-1 cann't create disk image in GlusterFS DATA STORAGE BUG

前面刚遇到一个不能使用gluster的bug,  http://blog.163.com/digoal@126/blog/static/16387704020147623132332/ 现在又一个, 现在这个是我手工创建的glusterfs volume, 然后在ovirt的storage中新建一个domain, 使用DATA/GlusterFS挂载, 挂载成功了. 但是在后面就出问题了, 创建虚拟机时, 如果选择使用GlusterFS的domain, 新建disk image会失败. 有其他的

主流邮箱可靠性测试

如今email已经是很重要的沟通工具,它的可靠性已经可以对我们的工作.学习和生活产生影响,选择邮箱时不得不考虑它.邮箱的可靠性表现在两方面:是否能将邮件正确送达,是否能够正常访问自己的信件.常有人抱怨邮件丢失,以前说mails(清华的学生收费邮箱)的比较多,近来又流传说gmail也会丢邮件,虽然自己没有碰到过,但还是有些担心,索性来做一个对比测试,看看各主流信箱的可靠性如何.第一轮,待测的邮箱为Gmail.Yahoo中国.Hotmail(Live Mail)和163(.com),这四个应该代表了