iSCSI的客户端messages频繁报错问题解决

问题现象:

在自己的工作站中安装的RAC测试环境,使用了iSCSI模拟共享存储,环境运行OK,但是在messages信息中频繁报错如下:

[root@db01rac2 ~]# tail -20f /var/log/messages
Jan 13 23:08:37 db01rac2 iscsid: iscsid: connecting to 192.168.1.10:3260
Jan 13 23:08:37 db01rac2 iscsid: iscsid: connected local port 64350 to 192.168.1.10:3260
Jan 13 23:08:37 db01rac2 iscsid: iscsid: login response status 0000
Jan 13 23:08:37 db01rac2 iscsid: iscsid: deleting a scheduled/waiting thread!
Jan 13 23:08:37 db01rac2 iscsid: iscsid: connection1:0 is operational after recovery (1 attempts)
Jan 13 23:08:39 db01rac2 iscsid: iscsid: Kernel reported iSCSI connection 1:0 error (1020 - ISCSI_ERR_TCP_CONN_CLOSE: TCP connection closed) state (3)
Jan 13 23:08:39 db01rac2 iscsid: iscsid: re-opening session 1 (reopen_cnt 0)
Jan 13 23:08:39 db01rac2 iscsid: iscsid: disconnecting conn 0x55beee57de90, fd 6
Jan 13 23:08:39 db01rac2 kernel: connection1:0: detected conn error (1020)
Jan 13 23:08:41 db01rac2 iscsid: iscsid: Poll was woken by an alarm
Jan 13 23:08:41 db01rac2 iscsid: iscsid: re-opening session 1 (reopen_cnt 0)

根据

  • http://community.oracle.com/customerconnect/discussion/637349/iscsid-kernel-reported-iscsi-connection-1-0-error-1020-iscsi-err-tcp-conn-close

的说法是:

This is normal and can be safely ignored.
The error sequence indicates that there was a temporary problem in connectivity to the storage backend but it was safely recovered within seconds.

但是,这是持续在/var/log/messages中报错的,虽然未影响RAC使用,但是总觉得这样刷日志肯定是不正常的,继续查询:

在suse的一篇文章中,

  • http://www.suse.com/zh-cn/support/kb/doc/?id=000020752

The systemd journal, by default also written to /var/log/messages, fills with similar messages when an iSCSI LUN is shared across multiple nodes.

这个写的场景很匹配,我这里就是两个节点共享同样的iSCSI LUN,但是究竟能否忽略这个错误呢?
或是有别的设置?

1.确保IQN的名字唯一性

如果我们需要避免这样的情况发生。需要在节点上修改IQN,避免重名。
而其实我这里原本这个文件是不一样的,但确实在配置时修改成一样的了:

cat /etc/iscsi/initiatorname.iscsi

[root@db01rac1 ~]# cat /etc/iscsi/initiatorname.iscsi
#InitiatorName=iqn.1988-12.com.oracle:178a747c44
InitiatorName=iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6:client

[root@db01rac2 ~]# cat /etc/iscsi/initiatorname.iscsi
#InitiatorName=iqn.1988-12.com.oracle:b8e5b14ad0fa
InitiatorName=iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6:client

可是如果不一样的话,按我现在的配置,就无法识别开机启动挂载盘;

那为何无法识别?是不是iSCSI服务端的ACL配置问题?

下面来验证下,先把 /etc/iscsi/initiatorname.iscsi 改回默认值,两个节点不一样;

[root@db01rac1 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1988-12.com.oracle:178a747c44

[root@db01rac2 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1988-12.com.oracle:b8e5b14ad0fa

如果不重启机器,直接尝试logout和login是没问题的:

iscsiadm -m node
iscsiadm -m discovery -t st -p 192.168.1.10
iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6 -p 192.168.1.10 --login

--以节点2为例:
[root@db01rac2 ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6 -p 192.168.1.10 --logout
Logging out of session [sid: 1, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6, portal: 192.168.1.10,3260]
Logout of [sid: 1, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6, portal: 192.168.1.10,3260] successful.
[root@db01rac2 ~]#
[root@db01rac2 ~]#
[root@db01rac2 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vdb         251:16   0  100G  0 disk
└─ora-u01   252:2    0  100G  0 lvm  /u01
sr0          11:0    1 1024M  0 rom
vda         251:0    0   10G  0 disk
├─vda2      251:2    0    9G  0 part
│ ├─ol-swap 252:1    0    1G  0 lvm  [SWAP]
│ └─ol-root 252:0    0    8G  0 lvm  /
└─vda1      251:1    0    1G  0 part /boot
[root@db01rac2 ~]#
[root@db01rac2 ~]#
[root@db01rac2 ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6 -p 192.168.1.10 --login
Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6, portal: 192.168.1.10,3260] (multiple)
Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6, portal: 192.168.1.10,3260] successful.
[root@db01rac2 ~]#
[root@db01rac2 ~]#
[root@db01rac2 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdf           8:80   0    1G  0 disk
sdd           8:48   0    1G  0 disk
vdb         251:16   0  100G  0 disk
└─ora-u01   252:2    0  100G  0 lvm  /u01
sr0          11:0    1 1024M  0 rom
sdg           8:96   0   30G  0 disk
sde           8:64   0    1G  0 disk
vda         251:0    0   10G  0 disk
├─vda2      251:2    0    9G  0 part
│ ├─ol-swap 252:1    0    1G  0 lvm  [SWAP]
│ └─ol-root 252:0    0    8G  0 lvm  /
└─vda1      251:1    0    1G  0 part /boot
sdh           8:112  0   16G  0 disk

但是如果重启了机器,会发现现有配置无法正常login操作:

[root@db01rac1 ~]# iscsiadm -m node
192.168.1.10:3260,1 iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6
[root@db01rac1 ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6 -p 192.168.1.10 --login
Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6, portal: 192.168.1.10,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6, portal: 192.168.1.10,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not log into all portals

2.修正iSCSI服务端ACL的配置

看起来真是iSCSI服务端ACL的配置问题,那就去服务端看下acl的配置:

acl 
/> cd /iscsi/iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6/tpg1/acls/
/iscsi/iqn.20...2b6/tpg1/acls> create iqn.1988-12.com.oracle:178a747c44
/iscsi/iqn.20...2b6/tpg1/acls> create iqn.1988-12.com.oracle:b8e5b14ad0fa
/iscsi/iqn.20...2b6/tpg1/acls> delete iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6:client

再次节点1尝试login,发现果然成功:

[root@db01rac1 ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6 -p 192.168.1.10 --login
Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6, portal: 192.168.1.10,3260] (multiple)
Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6, portal: 192.168.1.10,3260] successful.

ACL的配置我改为两个RAC节点的,删除了之前的配置,具体最终显示如下:

/iscsi/iqn.20...2b6/tpg1/acls> pwd
/iscsi/iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6/tpg1/acls
/iscsi/iqn.20...2b6/tpg1/acls> ls
o- acls .................................................................................................................. [ACLs: 2]
  o- iqn.1988-12.com.oracle:178a747c44 ............................................................................ [Mapped LUNs: 5]
  | o- mapped_lun0 ......................................................................................... [lun0 block/disk1 (rw)]
  | o- mapped_lun1 ......................................................................................... [lun1 block/disk2 (rw)]
  | o- mapped_lun2 ......................................................................................... [lun2 block/disk3 (rw)]
  | o- mapped_lun3 ......................................................................................... [lun3 block/disk4 (rw)]
  | o- mapped_lun4 ......................................................................................... [lun4 block/disk5 (rw)]
  o- iqn.1988-12.com.oracle:b8e5b14ad0fa .......................................................................... [Mapped LUNs: 5]
    o- mapped_lun0 ......................................................................................... [lun0 block/disk1 (rw)]
    o- mapped_lun1 ......................................................................................... [lun1 block/disk2 (rw)]
    o- mapped_lun2 ......................................................................................... [lun2 block/disk3 (rw)]
    o- mapped_lun3 ......................................................................................... [lun3 block/disk4 (rw)]
    o- mapped_lun4 ......................................................................................... [lun4 block/disk5 (rw)]
/iscsi/iqn.20...2b6/tpg1/acls>

这样,最终测试,重启两个rac节点,磁盘挂载正常,且再次查询/var/log/messages信息,不再有iscsi的报错。
其实这个问题早在很多年前的测试我就遇到过,当时没有查出来原因就忽略了,因为也不影响测试,又不是自己的专业范围,而如今本着成长型思维,注重这些细节,终于还是找到了原因。最后看着清爽的messages信息,还是有些成就感的_

AlfredZhao©版权所有「从Oracle起航,领略精彩的IT技术。」
本文转载于网络 如有侵权请联系删除

相关文章

  • 1.什么是线程池?为什么要使用线程池

    大家好,又见面了,我是你们的朋友全栈君。线程池作为java开发者必备技能,在日常开发中十分常见,所以从这一节开始我们介绍线程池。今天的内容有两点,第一点,为什么要使用线程池?第二点,什么是线程池?首先来看第一点,为什么要使用线程池?在没有使用线程池之前,我们是如何执行任务的?这是一个任务,任务内容是输出当前线程名称,接下来我们来执行该任务。首先将任务创建出来,然后创建一个线程,接着将任务传递给线程,紧接着启动线程,任务就开始执行了。程序输出thread-0,我们发现一个线程它只能执行一个任务,不能连续执行任务。例如这里有三个任务,它没法连续执行,没有上述这种写法,只能在创建两个线程去执行另外两个任务,程序分别输出三个线程的名称,这些线程执行。完任务以后就销毁了,如果再有任务时,则需要重新创建线程,这也暴露了一个问题,线程不能复用。重复创建和销毁线程耗时耗资源,如果能复用就好了,复用的好处就是省时省资源。下面我们就来看看线程池是如何执行任务的,还是这三个任务创建只有一个线程的线程池,这个线程池里面只有一个线程,这个不是重点,重点是他里面的这个线程可以复用调用他的execute的方法,将需

  • [译]你可以在JSX中使用console.log吗?

    原文链接:Canyouconsole.loginJSX? 原文作者:LlorençMuntaner 译者:进击的大葱 推荐理由:很多React初学者不知如何在React的JSX中使用console.log进行调试,本文将会介绍几个在JSX中使用console.log的方法。作为一个编程老师,我经常看到学生写以下代码进行调试:render(){ return{ <div> <h1>Listoftodos</h1> console.log(this.props.todos) </div> } }复制可是上面的代码并不可以得到他们想要的结果,浏览器会把这段代码console.log(this.props.todos)当做纯文本在界面展示出来。先不急着解释这个为什么不行的原因,让我们先看几个在JSX中正确使用console.log的方法。最常用的解决方法JSX中嵌入JS表达式:render(){ return( <div> <h1>Listoftodos</h1> {console.log(this.props

  • 第九十八期:Flutter学习(一)

    昨天和今天除了写一些小程序的代码之外,都在学习flutter相关的内容。感觉flutter的学习成本之所以高,很大的原因其实是因为它的学习资料真正能学到东西的,其实还是它的官网,但是官网又是英文版的,读起来就比较费劲。再一个是因为flutter的生态其实也是比较庞大的。除了基础的widget组件,还有两种不同风格的组件形式material和cupertino。除此之外,还有其他各种库,比如请求库,dio以及各种插件。https://api.flutter.dev/flutter/material/material-library.html官网的这个界面里枚举了flutter用到的库:组件库核心库coreweb端的库跨平台的继承库加密文件操作...等等组件其实还好,因为前端的组件这个概念其实都是通用的。基于原生的最基本的标签组件,我们进行组合来实现我们的业务组件。但是和web端不同的是,flutter的组件都是对象。它的属性方法和web比起来差异很大,对于新手来说不容易记的清楚。还有一个原因是flutter采用的Dart语言。一种类似ts但是有不同于ts的语言,这可能也是flutter学

  • 新建一个uniapp请求,并且封装request

    uni-app官网:https://uniapp.dcloud.net.cn/1:新建一个测试项目2:模拟一个简单的请求图片.pngindex.vue<template> <viewclass="page"> <viewclass="uni-list"> <viewclass="uni-list-cell"hover-class="uni-list-cell-hover"v-for="iteminitemList"> <viewclass="uni-list-cell-navigateuni-navigate-rightuni-media-list"> <viewclass="uni-media-list-logo"> <imagev-if="showImg":src="item.thumbnail_pic_s"></i

  • Spring AOP理解

    一AOP概述AOP(Aspect-OrientedProgramming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。SpringAOP就是基于动态代理的如果要代理的对象,实现了某个接口,那么SpringAOP会使用JDKProxy,去创建代理对象(相当于构造了一个实现了同样接口类型的代理对象,持有旧的被代理对象,在invoke里去调用被代理对象,并且做自己的增强操作)而对于没有实现接口的对象,就无法使用JDKProxy去进行代理了,这时候SpringAOP会使用Cglib生成一个被代理对象的子类,修改其字节码来作为代理,如下图所示:关于具体cglib和jdk动态代理的区别可以点链接看 SpringAOPProcess当然你也可以使用AspectJ,SpringAOP已经集成了AspectJ,AspectJ应该算的上是Java生态系统中最完整的AOP框架了。使用AOP之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样

  • Android CrashHandler编写自己的异常捕获的方法

    平时写代码,我们可能会抛出各种异常,这些异常有些是我们测试过程中发现进行解决的,但是也有一些异常是我们未知的,不论是代码的逻辑问题还是Android本身底层的一些bug,我们都需要及时了解并进行解决。当用户在使用app出现崩溃现象时我们需要知道是什么原因,并将原因记录下来上到服务器,这样以后我们就可以知道具体是什么原因了 CrashHandler类用于记录crash原因保存到sd卡中。publicclassCrashHandlerimplementsThread.UncaughtExceptionHandler{ privatestaticfinalStringTAG="CrashHandler"; privatestaticfinalbooleanDEBUG=true; //文件路径 privatestaticfinalStringPATH=Environment.getExternalStorageDirectory().getPath()+File.separator+"crash"; privatestaticfinalStringFIL

  • Hello Lightning Network -0

    有许多比特币社区的先行者们面对小白的提问时,总是真诚的说:“去看看比特币的白皮书吧,把它真正弄明白吧,你就会理解一切的。”—–如今,我想对许多质疑闪电网络的比特币先驱们说:“去看看闪电网络的白皮书吧,把它真正弄明白吧,你就会理解一切的。”闪电网络是次世代的支付技术,它不仅仅是一个支付技术,更是建立在比特币主网上的二层网络协议,将来会有许许多多新奇的应用建立在上面,它会为比特币开启下一个十年;但是闪电网络还在实现的早期阶段,能耐心去读懂它的白皮书的人已经非常少了,更不用提现在飞速发展的BOLT规范了;这其实跟比特币刚诞生时是一样的,在动辄就大谈“区块链技术改变未来”的那一群人中,有几人会真正花时间,去把已经发表11年的比特币8页白皮书弄个明白呢?闪电网络的基本原理其实非常简单,在我们之前的文章中已经花费了大量篇幅去介绍;但是在实现过程中,还有数不清的工程细节上的权衡;由于现在的实现还只是一个雏形,我们实操闪电网络交易的时候会有各种各样的“?”,我打算写一个系列文章,把一些有趣或者让人困惑的地方抽丝剥茧,记录一下自己的学习过程,也把这项迷人的技术介绍给更多人。我们将在这篇文章中对闪电网络做

  • 【Leetcode】133.克隆图

    题目给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值val(Int)和其邻居的列表(list[Node])。示例: img 输入: {"$id":"1","neighbors":[{"$id":"2","neighbors":[{"$ref":"1"},{"$id":"3","neighbors":[{"$ref":"2"},{"$id":"4","neighbors":[{"$ref":"3"},{"$ref":"1"}],"val":4}],"val":3}],"val":2},{"$

  • 基于redis实现tomcat的session会话保持

    基于redis实现tomcat的session会话保持在实际生产中,我们经常部署应用服务,在部署的过程中,要让用户无感知你的应用升级,这种方式可以通过负载均衡方式来实现灰度部署,如前些文章的Nginx方式来实现,通过负载均衡Nginx,更新某一台tomcat服务,再通知负载均衡Nginx,把Tomcat节点重新加载上去。依次这么做,把集群中的所有Tomcat都替换一次即可,就可以实现服务的灰度部署。如何让用户无感知?就是要实现用户的会话是可以共享的,基于session共享的方式有如下几种:1,使用数据库来存储session 2,使用cookie来存储session 3,使用redis来存储session 4,使用tomcat的session复制 5,使用mamcached来存储session 我们这里主讲解redis的方式来实现Tomcat的session共享。我们的例子使用了一台Nginx做负载均衡,后端挂接了两台Tomcat,且每台Tomcat的Session会话都保存到Redis数据库中。其中,Nginx配置为non-sticky运行模式,也即每一个请求都可以被分配到集群中的任何

  • Confluence 6 为边栏添加自定义内容

    你可以使用wiki标记和自定义内容来对边栏进行更进一步的自定义。希望添加自定义内容到你的边栏中:进入空间后,然后从边栏的底部选择 空间工具(Spacetools) > 外观和感觉(LookandFeel) 。.选择 边栏(Sidebar)头部(Header )和脚部(Footer)。在你的 边栏(Sidebar )字段中输入你的自定义内容。在边栏中,头部和脚部的字段都可以使用wiki的标记。请查看 guidetowikimarkup 页面中的内容来获得更多的帮助,或者查看我们在本页后部分提供的自定义内容。 在你的边栏中添加查找方法... 添加有一些内容的面板...希望在一个面板中添加一些自定义的内容到边栏中,你可以添加下面的Wiki标记到 边栏(Sidebar) 字段中,我们使用 PanelMacro 宏:{panel}Thisissomecustomcontenttoappearinthesidebar{panel}添加你自己的页面树来替代全局页面树...希望隐藏默认的页面树来添加你自己的页面树,添加下面的自定义参数:添加下面的Wiki标记,使用 PageTreeMacro 宏

  • 专访 | 腾讯云机器学习平台技术负责人黄明,详解 DI-X 深度学习平台

    机器之心原创作者:高静宜3月28日,腾讯云宣布推出深度学习平台DI-X(DataIntelligenceX),为机器学习、深度学习用户提供一站式服务,为其在AI领域的探索降低门槛并提供最流畅的体验。DI-X平台基于腾讯云的大数据存储与处理能力,集成Caffe、TensorFlow、Torch主流深度学习框架,主打行云流水的拖拽式操作,具备强大的业内开源及腾讯自研算法库和模型库。DI-X平台的推出是腾讯在AI领域长线布局中不可缺少的一环,也宣告腾讯云在AI布局的全面加速。人工智能学习平台已然成为巨头公司的必争之地。在3月29日的云栖大会上,阿里云也正式推出了升级版机器学习平台PAI2.0。那么,DI-X平台可以为用户带来哪些便利,有怎样的战略意义,在激烈的商业竞争和技术竞赛中如何突出重围?机器之心对腾讯T4专家、腾讯云机器学习平台技术负责人黄明进行了采访,从中得到了答案。机器之心:深度学习平台不是一个新鲜概念,国内外一些公司早已尝试研发深度学习平台,部分公司已见成效。能否介绍一下为什么选择在这个时候推出这款基于腾讯云的深度学习平台DI-X吗?黄明:与腾讯云许多优势产品与能力一样,DI-X

  • 大型数据集的MySQL优化

    诸多知名大公司都在使用MySQL,其中包括Google、Yahoo、NASA和Walmart。此外,其中部分公司的表囊括数十亿行,却又性能极佳。虽然很难保持MySQL数据库高速运行,但面对数据堆积,可以通过一些性能调整,来使其继续工作。本文则将围绕这一问题展开讨论。导论设计数据库之前,有必要先了解一下表的使用方法。例如,对于需要频繁更新的数据,最好将其存入一个独立表中,而通过这样的分表,更新操作将更加快捷。同时,表的连接操作也会消耗时间,所以若要深入分析复杂数据,则最好选用大表。惯有认知下,归一化可通过清除冗余来减少数据。然而,归一化也有其负面作用:它会极大地增加索引查找量。考虑到其需要随机访问读取标准硬盘,故而有时也会选用反归一化。虽然新加载的数据库能够很好地有序运行,但随着数据库进一步扩展,这种有序操作将难以保持,从而导致更多的随机I/O和性能问题。尽管“反归一化”可能颠覆了一些传统认知,但随着“元数据”理念兴起,为求性能和扩展性的双重提升,包括Google、eBay和Amazon在内的众多主要参与者,都对其数据库进行了“反归一化”调整。更有甚者,传统思维上的这一转变,还在众多数据

  • 研发效能中的需求管理

    上一篇「找到能做好研发效能的人」,我介绍了如何找到研发效能的领域专家,这一篇我来分享一下之前在带团队做产品的时候一些需求管理的经验,尤其是做研发效能平台涉及到的一些情况。后面还会陆续更新,敬请期待。本篇主要分成「需求来源」「需求优先级」「需求文档质量」「需求评审」「需求验收」和「需求上线」六部分。需求来源我们在公司做内部支撑平台的产品,一开始一穷二白啥都没有,所以主要需求有1)产品规划2)系统缺陷3)用户反馈三类。来到公司我们做的第一件事情,就是摸排公司在研发效能这个方向上的水位,公司都有哪些活动,哪些流程,有哪些工具,每个工具都在哪些部门的谁手里,工具的使用程度如何,大家都有哪些诉求等等。经过和相关小伙伴聊了N遍之后,我们定下了主要方向和相关的时间节点。所以大部分需求都是产品规划中的需求。另外一种是系统缺陷,这部分改动大的就放到产品需求里,小的直接修复,主要考虑工作量大小和优先级。用户反馈的需求,这部分要仔细判断。大量用户反馈的共性需求,可以考虑;但是对于很多专家型的小伙伴提出的诉求,评估时一定要慎重。尤其是产品前期,要把精力绝对地放到基本诉求,核心功能上。而不是很多「高级」「酷炫」

  • IIR数字滤波器设计(数字信号处理)

            IIR数字滤波器设计(数字信号处理)一、实验目的1.熟悉双线性变换法设计IIR数字滤波器的原理与方法。2.掌握IIR数字滤波器的MATLAB实现方法,会调用ellipord()和ellip() 函数设计各种滤波器。3.观察分析滤波器输入输出数据波形,理解数字滤波的概念。二、实验原理及步骤(一)实验原理-双线性变换法数字滤波器是对数字信号实现滤波的线性时不变系统。数字滤波实质上是一种运算过程,实现对信号的运算处理。输入数字信号(数字序列)通过特定的运算转变为输出的数字序列,因此,数字滤波器本质上是一个完成特定运算的数字计算过程,也可以理解为是一台计算机。描述离散系统输出与输入关系的卷积和差分方程只是给数字信号滤波器提供运算规则,使其按照这个规则完成对输入数据的处理。时域离散系统的频域特性:其中、分别是数字滤波器的输出序列和输入序列的频域特性(或称为频谱特性),是数字滤波器的单位取样响应的频谱,又称为数字滤经过滤波后的频域响应。只要按照输入信号频谱的特点和处理信号的目的,适当选择,使得滤波后满足设计的要求,这就是数字滤波器的滤波原理。数字滤波器根据其冲激响应函数的时域特性,

  • 华为云CDN如何加速ECS资源?

    前提条件 已购买弹性云服务器ECS,且绑定弹性公网IP。 已经按照域名准入要求准备好需要接入的域名。 已开通CDN服务。 背景介绍 ECS(弹性云服务器)是由CPU、内存、操作系统、云硬盘组成的基础的计算组件,可以根据业务灵活配置,节约大量的硬件成本。ECS服务分区域,跨区域访问会存在网络延时的问题,影响用户体验。 华为云CDN可以有效加速网站,为用户提供良好的体验。通过CDN加速ECS资源,这样构造的业务系统可以在降低成本的同时,提高终端用户使用感受。当终端用户发起访问请求时,会首先通过CDN查找对此域名响应速度较快的CDN节点,并查询此节点是否有缓存终端用户请求的内容。如果CDN节点有缓存用户所需资源,直接将资源返回给用户;如果CDN节点无缓存,则回源请求资源返回给用户,同时将资源缓存到CDN节点。 方案优势 用户访问网站资源,全部通过CDN,降低源站压力。 使用CDN流量,单价低于ECS直接访问外网流量,可以节约50%到57%的带宽成本,详见通过CDN减少公网带宽费用。 终端用户从距离最近的CDN节点获取资源,减少网络传输距离,保证静态资源质量。 配置步骤 在CDN

  • pyquery的中文编码问题

    #coding=UTF-8 importurllib.request importpyquery importrequests importtime importjson importpymysql importsys importmath fromdatetimeimportdatetime importtime importcsv fromtimeimportsleep importrandom frombs4importBeautifulSoup importasyncio frompyppeteerimportlaunch importpyppeteer frompyqueryimportPyQueryaspq importchardet importcodecs path='D:/code-py-download/02fang/xqxq_demo_utf8.html' txt=open(path,'rb').read() encodings=chardet.detect(txt)['encoding'] withopen(path,"r",encoding=encodin

  • 牛客题霸 [矩阵元素查找] C++题解/答案

    牛客题霸[矩阵元素查找]C++题解/答案 题目描述 已知int一个有序矩阵mat,同时给定矩阵的大小n和m以及需要查找的元素x,且矩阵的行和列都是从小到大有序的。设计查找算法返回所查找元素的二元数组,代表该元素的行号和列号(均从零开始)。保证元素互异。 题解: 因为行和列都是有序的,所以两个变量一个表示行一个表示列通过比较,先找到对应的列,再找到对应的行 代码: classFinder{ public: vector<int>findElement(vector<vector<int>>mat,intn,intm,intx){ //writecodehere vector<int>res; if(n==0||m==0) returnres; inti=0,j=m-1; while(i<n&&j>=0) { if(mat[i][j]>x)j--; elseif(mat[i][j]<x)++i; else { res.push_back(i); res.push_back(j); break; }

  • React Native知识5-Touchable类组件

    ReactNative没有像web那样可以给元素绑定click事件,前面我们已经知道Text组件有onPress事件,为了给其他组件 也绑定点击事件,ReactNative提供了3个组件来做这件事。 1.TouchableHighlight:高亮触摸,用户点击时,会产生高亮效果。 2.TouchableOpacity:透明触摸。用户点击时,点击的组件会出现透明效果。 3.TouchableWithoutFeedback:无反馈性触摸。用户点击时无任何视觉效果。 注意:只支持一个子节点,如果你希望包含多个子组件,用一个View来包装它们。   一:TouchableHighlight 1:当手指点击按下的时候,该视图的不透明度会进行降低同时会看到相应的颜色,其实现原理则是在底层新添加了一个View。此外,TouchableHighlight只能进行一层嵌套,不能多层嵌套。 常用属性: 1.1:activeOpacity number  设置组件在进行触摸的时候,显示的不透明度(取值在0-1之间) 1.2:onHideUnderlay functio

  • 简单记录五个Linux设置定时任务的步骤(自动化运维必备)

    这几天我们国庆节休息,但是作为运维工作的同学们是不是也不能闲着,担心工作中是不是有任务在执行中需要维护。于是,我们很多的运维工作都是用的自动化运维监控,如果有故障都会定时的处理和告警的。这个与我们的Linux设置定时任务分不开的。在这篇文章中,老蒋简单的记录五个Linux设置定时任务的步骤。 第一、登录服务器 这里我们用ROOT权限登录服务器,准备设置。 第二、寻找定时文件夹 root@laojiang:~#cd/var/spool/cron/ root@laojiang:/var/spool/cron# 复制 SelectCode Copy 第三、查看定时任务 root@laojiang:/var/spool/cron#crontab-l nocrontabforroot 复制 SelectCode Copy 第四、编辑定时文件 这里我们用vi编辑定时文件。 时间格式 分钟小时日期月份周命令 数字范围0-590-231-311-120-7echo"hello">>abc.log 复制 SelectCode Copy 特殊字符的含义

  • iOS逆向:越狱手机抹除数据、还原,cydia出错(2021.04.21 完结)

    打开cydia,出现如下,黄字。最近安装列表为空,键盘也有点异常。 Couldnotopenfile-open(2:Nosuchfileordirectory) Problemopening复制   原因:抹除数据的时候,把cydia的文件夹lib也抹除了。 目标:不管用什么方法,恢复lib文件夹就行、或者重装cydia。   0、准备   从其他手机,或网上复制一份lib文件夹过来。   0-1)、可用爱思助手   0-2)、也可用ssh指令 sshroot@同一Wi-Fi下越狱手机ip cd/var zip-rlib.zip./lib Ctr+D退出ssh scproot@同一Wi-Fi下越狱手机ip:/var/lib.zip/Users/用户/复制   1、导入lib.zip   分为三种情况,   1-1)、可用爱思助手导入到"/var/"目录下(afc2还可用的话)   1-2)、可用爱思助手导入到"用户"目录下(如果是不完美越狱,重启,重新越狱,以前安装的afc2也会失效,只能看到"用户"目录)     此时,需要把"lib.zip"从

  • 监听线程是否执行完毕

    ThreadPoolExecutorexecutor=newThreadPoolExecutor(1,1,1000,TimeUnit.MILLISECONDS,newArrayBlockingQueue<Runnable>(1),Executors.defaultThreadFactory()); executor.shutdown(); if(executor.isTerminated()){ //巴拉巴拉巴拉巴拉 }复制  

相关推荐

推荐阅读