关于linux-kernel:如何测量进程级别或容器级别的-IO-延迟

概述IO 提早问题简直是每个生产零碎都会或多或少遇到的问题。尽管当初 NVMe + SSDs 曾经能够达到 10Gbytes/s 的呑吐量,价格也十分亲民。但 IO 提早问题不会隐没。因为: 一些基于网络的的存储计划,如 Ceph,人造地有不稳定性SSD / RAIN Controller 自身的不稳定性在 Linux 下,传统地,咱们有 iostat / sar 等等工具能够看零碎级、存储设备级的问题。但均不能通知你以下几点: 产生 IO 提早时,过程/线程实际上的挂起时长过程/线程因 IO 提早挂起过几次这些问题,在 Linux 下因为写操作的异步落盘 pdflush 线程,问题变得更加难答复。当然,你能够用新技术 BPF,但不肯定须要这个牛刀。 有同学会问,晓得 IO 提早对线程的理论影响有什么用?答案可见我另外的两篇文章: eBPF 求证坊间风闻:Java GC 日志可导致整个 JVM 服务卡顿?eBPF 求证坊间风闻:mmap + Java Safepoint 可导致整个 JVM 服务卡顿?基本原理Linux 有很多暗藏个性,其中 Per-task statistics interface 与其下层的 Delay accounting 能够为每个线程减少一些 delay 的统计指标。 内核源码中,也有读取相干指标的 demo 利用源码。以下是一个操作示例: sudo sysctl kernel.task_delayacct=1# run your appsudo ./getdelays -t 608452 -d -iprint delayacct stats ONprinting IO accountingTGID 608452CPU count real total virtual total delay total delay average 60043 4332000000 4670325102 49110971 0.001msIO count delay total delay average 199 200090856599 1005msSWAP count delay total delay average 0 0 0msRECLAIM count delay total delay average 0 0 0msTHRASHING count delay total delay average 0 0 0msCOMPACT count delay total delay average 0 0 0msWPCOPY count delay total delay average 201 313245 0ms: read=0, write=0, cancelled_write=0Ubuntu 如同没有这个 getdelays 工具的 apt 包,须要本人编译。我是个懒人,所以我抉择了另一个查看这些指标的办法。 ...

September 26, 2023 · 3 min · jiezi

关于linux-kernel:从内核世界透视-mmap-内存映射的本质原理篇

本文基于内核 5.4 版本源码探讨之前有不少读者给笔者留言,心愿笔者写一篇文章介绍下 mmap 内存映射相干的常识体系,之所以迟迟没有动笔,是因为 mmap 这个零碎调用看上去简略,实际上并不简略,能够说是非常复杂的一个零碎调用。 如果想要给大家把 mmap 背地的技术实质,正确地,清晰地还原进去,还是有肯定难度的,因为 mmap 这一个零碎调用就能撬动起整个内存管理系统,文件系统,页表体系,缺页中断等一大片的背景常识,波及到的知识面广且繁冗。 侥幸的是这一整套的背景常识,笔者曾经在 《聊聊 Linux 内核》 系列文章中为大家具体介绍过了,所以当初是时候开始动笔了,不过大家不须要放心,尽管波及到的背景常识比拟多,然而在前面的相干章节里,笔者还会为大家从新交代。 在上一篇文章 《一步一图带你构建 Linux 页表体系》 中,笔者为大家介绍了内存映射最为外围的内容 —— 页表体系。通过一步一图的形式为大家展现了整个页表体系的演进过程,并在这个过程中逐渐揭开了整个页表体系的全貌。 本文的内容仍然是内存映射相干的内容,这一次笔者会带着大家围绕页表这个最为外围的体系,在页表的外围进行内存映射相干常识的介绍,外围目标就是彻底为大家还原内存映射背地的技术实质,由浅入深地给大家讲透彻,弄明确。 在咱们正式开始明天的内容之前,笔者想首先抛出几个问题给大家思考,倡议大家带着这几个问题来浏览接下来的内容,咱们独特来将这些迷雾一层一层地缓缓拨开,直到还原出内存映射的实质。 既然咱们是在探讨虚拟内存与物理内存的映射,那么首先你得有虚拟内存,你也得有物理内存吧,在这个根底之上,能力探讨两者之间的映射,而物理内存是怎么来的,笔者曾经通过前边文章 《深刻了解 Linux 物理内存调配全链路实现》 介绍的十分分明了,那虚拟内存是怎么来的呢 ?内核调配虚拟内存的过程是怎么的呢?咱们晓得内存映射是依照物理内存页为单位进行的,而在内存治理中,内存页次要分为两种:一种是匿名页,另一种是文件页,这一点笔者曾经在 《一步一图带你深刻了解 Linux 物理内存治理》 一文中重复讲过很屡次了。依据物理内存页的类型分类,内存映射天然也分为两种:一种是虚拟内存对匿名物理内存页的映射,另一种是虚拟内存对文件页的映射。对于文件映射,大家或多或少在网上看到过这样的阐述——" 通过内存文件映射能够将磁盘上的文件映射到内存中,这样咱们就能够通过读写内存来实现磁盘文件的读写 "。对于这个阐述,如果对内存治理和文件系统不相熟的同学,可能感到这句话十分的神奇,会有这样的一个疑难,内存就是内存啊,磁盘上的文件就是文件啊,这是两个齐全不同的货色,为什么说读写内存就相当于读写磁盘上的文件呢 ?内存文件映射在内核中到底产生了什么 ?咱们常常谈到的内存映射,到底映射的是什么?在上篇文章中笔者只是为大家展现了整个页表体系的全貌,以及页表体系一步一步的演进过程,然而在过程被创立进去之后,内核也仅是会为过程调配一张全局页目录表 PGD(Page Global Directory)而已,此时过程虚拟内存空间中只存在一张顶级页目录表,而在上图中所展现的四级页表体系中的下层页目录 PUD(Page Upper Directory),两头页目录 PMD(Page Middle Directory)以及一级页表是不存在的,那么上图展现的这个页表残缺体系是在什么时候,又是如何被一步一步构建进去的呢?本文的宗旨就是围绕上述这几个问题来开展的,那么从何谈起呢 ?笔者想了一下,还是应该从咱们最为相熟的,在用户态常常接触到的内存映射零碎调用 mmap 开始聊起~~~ 1. 详解内存映射零碎调用 mmap#include <sys/mman.h>void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);// 内核文件:/arch/x86/kernel/sys_x86_64.cSYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long, prot, unsigned long, flags, unsigned long, fd, unsigned long, off)mmap 内存映射里所谓的内存其实指的是虚拟内存,在调用 mmap 进行匿名映射的时候(比方进行堆内存的调配),是将过程虚拟内存空间中的某一段虚拟内存区域与物理内存中的匿名内存页进行映射,当调用 mmap 进行文件映射的时候,是将过程虚拟内存空间中的某一段虚拟内存区域与磁盘中某个文件中的某段区域进行映射。 ...

September 18, 2023 · 12 min · jiezi

关于linux-kernel:Cloud-Kernel-SIG月度动态发布-Anolis-88-镜像kABI-社区共建流程

Cloud Kernel SIG(Special Interest Group):撑持龙蜥内核版本的研发、公布和服务,提供生产可用的高性价比内核产品。 01 SIG 整体停顿Anolis 8.8 镜像公布,默认搭载 ANCK 5.10-013 版本。Anolis 23 滚动内核更新至 6.1LTS。kABI 文档公布与 kABI 构造体预留合入。Cloud Kernel 门禁更新。02 Anolis 8.8 镜像默认内核切换至 5.10-013 版本Anolis 8.8 发行版默认内核由 4.19 内核切换到 5.10 内核。默认搭载的内核版本是 5.10.134-13.an8,能够在零碎内执行下列命令查看对应的内核版本信息。 $ uname -r5.10.134-13.an8.x86_64留神,如果是从 Anolis OS 8.8 以前的镜像版本升级而来,默认内核版本不会主动降级到 5.10 内核。 5.10-013 内核版本更新包含: 反对内核 CVE 修复。修复了 CVE-2022-32250,CVE-2022-34918 等重要的 CVE 破绽。反对用户态 /dev/ioasid。SWIOTLB 机制性能优化。virtio-net 关上 napi.tx 优化 TCP Small Queue 性能。反对 AST2600 PCIe 2D VGA Driver。反对 FT2500 处理器。反对动静开启 Group identity 个性。Arm64 平台默认内核启动。cmdline 调整增加 Compact Numa Aware(CNA)spinlock 性能反对。丰盛 Arm64 的 perf mem 和 perf c2c 性能。fsck.xfs 反对日志复原。hugetext 自适应按需大页。反对 SGX 动态内存治理。使能 wireguard 模块。03 Anolis 23 滚动内核降级至 6.1LTSAnolis 23 仓库地址:https://gitee.com/anolis/anck-next ...

April 23, 2023 · 2 min · jiezi

关于linux-kernel:ELF-格式简述-eBPF-基础知识

本文摘自我的《Mark’s DevOps 雜碎》中的 《ELF 格局简述》。如图片不清,可转回原处。引为何要钻研 ELF 格局?因为想深刻点学习 eBPF ,充分利用它的个性,而非只利用它的名声,ELF 格局是跳不过的。 ELF 格局简述程序代码被编译和链接成蕴含二进制计算机指令的可执行文件。而可执行文件是有格局标准的,在 Linux 中,这个标准叫 Executable and linking format (ELF)。ELF 中蕴含二进制计算机指令、静态数据、元信息。 静态数据 - 咱们在程序中 hard code 的货色数据,如字串常量等二进制计算机指令汇合,程序代码逻辑生成的计算机指令。代码中的每个函数都在编译时生成一块指令,而链接器负责把一块块指令间断排列到输入的 ELF 文件的 .text section(区域) 中。元信息,可再细分为两类: 通知操作系统,如何加载和动静链接可执行文件,实现过程内存的初始化。一些非运行期必须,但能够帮忙定位问题的信息。如 .symtab section视图ELF 文件提供 2 个不同的视图(视角): 链接视图(Linking view) - 对应 section header table 通知操作系统,动静链接可执行文件,实现过程内存的初始化。同时也为调试器提供一些元信息。 执行视图(execution view) - 对应 program header table(segment header table) 通知操作系统,如何加载可执行文件,实现过程内存的初始化。一个可执行的 ELF,肯定有program header table 从二进制串看,一个典型的 ELF 文件长这样: <p align = "center">典型的 ELF 文件格式例子 (图源自 [Computer Systems - A Programmer’s Perspective])</p> ...

March 5, 2023 · 10 min · jiezi

关于linux-kernel:深入理解-Linux-物理内存分配全链路实现

前文回顾在上篇文章 《深刻了解 Linux 物理内存治理》中,笔者具体的为大家介绍了 Linux 内核如何对物理内存进行治理以及相干的一些内核数据结构。 在介绍物理内存治理之前,笔者先从 CPU 的角度开始,介绍了三种 Linux 物理内存模型:FLATMEM 平坦内存模型,DISCONTIGMEM 非间断内存模型,SPARSEMEM 稠密内存模型。 随后笔者又带大家站在一个新的视角上,把物理内存看做成一个整体,从 CPU 拜访物理内存以及 CPU 与物理内存的绝对地位变动的角度介绍了两种物理内存架构:一致性内存拜访 UMA 架构,非一致性内存拜访 NUMA 架构。 在 NUMA 架构下,只有 DISCONTIGMEM 非间断内存模型和 SPARSEMEM 稠密内存模型是可用的。而 UMA 架构下,后面介绍的三种内存模型能够配置应用。无论是 NUMA 架构还是 UMA 架构在内核中都是应用雷同的数据结构来组织治理的,在内核的内存治理模块中会把 UMA 架构当做只有一个 NUMA 节点的伪 NUMA 架构。 这样一来这两种架构模式就在内核中被对立治理起来,咱们基于这个事实,深刻分析了内核针对 NUMA 架构下用于物理内存治理的相干数据结构:struct pglist_data (NUMA 节点),struct zone(物理内存区域),struct page(物理页)。 上图展现的是在 NUMA 架构下,NUMA 节点与物理内存区域 zone 以及物理内存页 page 之间的档次关系。 物理内存被划分成了一个一个的内存节点(NUMA 节点),在每个 NUMA 节点外部又将其所治理的物理内存依照性能不同划分成了不同的内存区域 zone ,每个内存区域 zone 治理一片用于具体性能的物理内存页 page,而内核会为每一个内存区域调配一个搭档零碎用于治理该内存区域下物理内存页 page 的调配和开释。 ...

January 2, 2023 · 17 min · jiezi

关于linux-kernel:一步一图带你深入理解-Linux-物理内存管理

1. 前文回顾在上篇文章 《深刻了解 Linux 虚拟内存治理》 中,笔者别离从过程用户态和内核态的角度具体深刻地为大家介绍了 Linux 内核如何对过程虚拟内存空间进行布局以及治理的相干实现。在咱们深刻了解了虚拟内存之后,那么何不顺带着也探秘一下物理内存的治理呢? 所以本文的目标是在深刻了解虚拟内存治理的根底之上持续带大家向前奋进,一举击破物理内存治理的常识盲区,使大家可能鸟瞰整个 Linux 内存管理子系统的整体全貌。 而在正式开始物理内存治理的主题之前,笔者感觉有必须在带大家回顾下上篇文章中介绍的虚拟内存治理的相干常识,不便大家来回比照虚拟内存和物理内存,从而能够全面整体地把握 Linux 内存管理子系统。 在上篇文章的一开始,笔者首先为大家展示了咱们应用程序频繁接触到的虚拟内存地址,清晰地为大家介绍了到底什么是虚拟内存地址,以及虚拟内存地址别离在 32 位零碎和 64 位零碎中的具体表现形式: 在咱们分明了虚拟内存地址这个基本概念之后,随后笔者又抛出了一个问题:为什么咱们要通过虚拟内存地址拜访内存而不是间接通过物理地址拜访? 原来是在多过程零碎中间接操作物理内存地址的话,咱们须要准确地晓得每一个变量的地位都被安顿在了哪里,而且还要留神以后过程在和多个过程同时运行的时候,不能共用同一个地址,否则就会造成地址抵触。 而虚拟内存空间的引入正是为了解决多过程地址抵触的问题,使得过程与过程之间的虚拟内存地址空间互相隔离,互不烦扰。每个过程都认为本人独占所有内存空间,将多过程之间的协同相干细节通通交给内核中的内存治理模块来解决,极大地解放了程序员的心智累赘。这一切都是因为虚拟内存可能为过程提供内存地址空间隔离的功绩。 在咱们分明了虚拟内存空间引入的意义之后,笔者紧接着为大家介绍了过程用户态虚拟内存空间别离在 32 位机器和 64 位机器上的布局状况: 在理解了用户态虚拟内存空间的布局之后,紧接着咱们又介绍了 Linux 内核如何对用户态虚拟内存空间进行治理以及相应的治理数据结构: 在介绍完用户态虚拟内存空间的布局以及治理之后,咱们随后又介绍了内核态虚拟内存空间的布局状况,并联合之前介绍的用户态虚拟内存空间,失去了 Linux 虚拟内存空间别离在 32 位和 64 位零碎中的整体布局状况: 在虚拟内存全副介绍结束之后,为了可能承前启后,于是笔者持续在上篇文章的最初一个大节从计算机组成原理的角度介绍了物理内存的物理组织构造,不便让大家了解到底什么是真正的物理内存 ?物理内存地址到底是什么 ?由此为本文的主题 —— 物理内存的治理 ,埋下伏笔~~~ 最初笔者介绍了 CPU 如何通过物理内存地址向物理内存读写数据的残缺过程: 在咱们回顾完上篇文章介绍的用户态和内核态虚拟内存空间的治理,以及物理内存在计算机中的实在组成构造之后,上面笔者就来正式地为大家介绍本文的主题 —— Linux 内核如何对物理内存进行治理 2. 从 CPU 角度看物理内存模型在前边的文章中,笔者曾多次提到内核是以页为根本单位对物理内存进行治理的,通过将物理内存划分为一页一页的内存块,每页大小为 4K。一页大小的内存块在内核中用 struct page 构造体来进行治理,struct page 中封装了每页内存块的状态信息,比方:组织构造,应用信息,统计信息,以及与其余构造的关联映射信息等。 ...

November 22, 2022 · 27 min · jiezi

关于linux-kernel:一步一图带你深入理解-Linux-虚拟内存管理

写在本文开始之前....从本文开始咱们就正式开启了 Linux 内核内存管理子系统源码解析系列,笔者还是会秉承之前系列文章的格调,采纳一步一图的形式先是具体介绍相干原理,在保障大家清晰了解原理的根底上,咱们再来一步一步的解析相干内核源码的实现。有了源码的辅证,这样大家看得也安心,了解起来也释怀,最起码能够证实笔者没有胡编乱造骗大家,哈哈~~ 内存管理子系统堪称是 Linux 内核泛滥子系统中最为简单最为宏大的一个,其中蕴含了泛滥繁冗的概念和原理,通过内存治理这条主线咱们把能够把操作系统的泛滥外围零碎给拎进去,比方:过程管理子系统,网络子系统,文件子系统等。 因为内存管理子系统过于简单宏大,其中波及到的泛滥繁冗的概念又是一环套一环,层层递进。如何把这些繁冗的概念具备层次感地,并且清晰地,给大家梳理出现进去真是一件比拟有难度的事件,因而对于这个问题,笔者在动笔写这个内存治理源码解析系列之前也是思考了很久。 万事开头难,那么到底什么内容适宜作为这个系列的开篇呢 ?笔者还是感觉从大家日常开发工作中接触最多最为相熟的局部开始比拟好,比方:在咱们日常开发中创立的类,调用的函数,在函数中定义的局部变量以及 new 进去的数据容器(Map,List,Set .....等)都须要存储在物理内存中的某个角落。 而咱们在程序中编写业务逻辑代码的时候,往往须要援用这些创立进去的数据结构,并通过这些援用对相干数据结构进行业务解决。 当程序运行起来之后就变成了过程,而这些业务数据结构的援用在过程的视角里全都都是虚拟内存地址,因为过程无论是在用户态还是在内核态可能看到的都是虚拟内存空间,物理内存空间被操作系统所屏蔽过程是看不到的。 过程通过虚拟内存地址拜访这些数据结构的时候,虚拟内存地址会在内存管理子系统中被转换成物理内存地址,通过物理内存地址就能够拜访到真正存储这些数据结构的物理内存了。随后就能够对这块物理内存进行各种业务操作,从而实现业务逻辑。 那么到底什么是虚拟内存地址 ?Linux 内核为啥要引入虚拟内存而不间接应用物理内存 ?虚拟内存空间到底长啥样?内核如何治理虚拟内存?什么又是物理内存地址 ?如何拜访物理内存?本文笔者就来为大家具体一一解答上述几个问题,让咱们马上开始吧~~~~ 1. 到底什么是虚拟内存地址首先人们提出地址这个概念的目标就是用来不便定位事实世界中某一个具体事物的实在地理位置,它是一种用于定位的概念模型。 举一个生存中的例子,比方大家在日常生活中给亲朋好友邮寄一些本地特产时,都会填写收件人地址以及寄件人地址。以及在日常网上购物时,都会在相应电商 APP 中填写本人的播种地址。 随后快递小哥就会依据咱们填写的收货地址找到咱们的实在住所,将咱们网购的商品送达到咱们的手里。 收货地址是用来定位咱们在事实世界中实在住所地理位置的,而事实世界中咱们所在的城市,街道,小区,屋宇都是一砖一瓦,一草一木实在存在的。但收货地址这个概念模型在事实世界中并不实在存在,它只是人们提出的一个虚构概念,通过收货地址这个虚构概念将它和事实世界实在存在的城市,小区,街道的地理位置一一映射起来,这样咱们就能够通过这个虚构概念来找到事实世界中的具体地理位置。 综上所述,收货地址是一个虚拟地址,它是人为定义的,而咱们的城市,小区,街道是实在存在的,他们的地理位置就是物理地址。 比方当初的广东省深圳市在过来叫宝安县,河北省的石家庄过来叫常山,安徽省的合肥过来叫泸州。不论是常山也好,石家庄也好,又或是合肥也好,泸州也罢,这些都是人为定义的名字而已,然而中央还是那个中央,它所在的地理位置是不变的。也就说虚拟地址能够人为的变来变去,然而物理地址永远是不变的。 当初让咱们把视角在切换到计算机的世界,在计算机的世界里内存地址用来定义数据在内存中的存储地位的,内存地址也分为虚拟地址和物理地址。而虚拟地址也是人为设计的一个概念,类比咱们事实世界中的收货地址,而物理地址则是数据在物理内存中的实在存储地位,类比事实世界中的城市,街道,小区的实在地理位置。 说了这么多,那么到底虚拟内存地址长什么样子呢? 咱们还是以日常生活中的收货地址为例做出类比,咱们都很相熟收货地址的格局:xx省xx市xx区xx街道xx小区xx室,它是依照地区档次递进的。同样,在计算机世界中的虚拟内存地址也有这样的递进关系。 这里咱们以 Intel Core i7 处理器为例,64 位虚拟地址的格局为:全局页目录项(9位)+ 下层页目录项(9位)+ 两头页目录项(9位)+ 页内偏移(12位)。共 48 位组成的虚拟内存地址。 虚拟内存地址中的全局页目录项就类比咱们日常生活中播种地址里的省,下层页目录项就类比市,中间层页目录项类比区县,页表项类比街道小区,页内偏移类比咱们所在的楼栋和几层几号。 这里大家只须要大体明确虚拟内存地址到底长什么样子,它的格局是什么,可能和日常生活中的收货地址比照了解起来就能够了,至于页目录项,页表项以及页内偏移这些计算机世界中的概念,大家临时先不必管,后续文章中笔者会缓缓给大家解释分明。32 位虚拟地址的格局为:页目录项(10位)+ 页表项(10位) + 页内偏移(12位)。共 32 位组成的虚拟内存地址。 过程虚拟内存空间中的每一个字节都有与其对应的虚拟内存地址,一个虚拟内存地址示意过程虚拟内存空间中的一个特定的字节。2. 为什么要应用虚拟地址拜访内存通过第一大节的介绍,咱们当初明确了计算机世界中的虚拟内存地址的含意及其展示模式。那么大家可能会问了,既然物理内存地址能够间接定位到数据在内存中的存储地位,那为什么咱们不间接应用物理内存地址去拜访内存而是抉择用虚拟内存地址去拜访内存呢? 在答复大家的这个疑难之前,让咱们先来看下,如果在程序中间接应用物理内存地址会产生什么状况? 假如当初没有虚拟内存地址,咱们在程序中对内存的操作全都都是应用物理内存地址,在这种状况下,程序员就须要准确的晓得每一个变量在内存中的具体位置,咱们须要手动对物理内存进行布局,明确哪些数据存储在内存的哪些地位,除此之外咱们还须要思考为每个过程到底要调配多少内存?内存缓和的时候该怎么办?如何防止过程与过程之间的地址抵触?等等一系列简单且琐碎的细节。 如果咱们在单过程零碎中比方嵌入式设施上开发应用程序,零碎中只有一个过程,这单个过程独享所有的物理资源包含内存资源。在这种状况下,上述提到的这些间接应用物理内存的问题可能还好解决一些,然而依然具备很高的开发门槛。 然而在古代操作系统中往往反对多个过程,须要解决多过程之间的协同问题,在多过程零碎中间接应用物理内存地址操作内存所带来的上述问题就变得非常复杂了。 这里笔者为大家举一个简略的例子来阐明在多过程零碎中间接应用物理内存地址的复杂性。 比方咱们当初有这样一个简略的 Java 程序。 public static void main(String[] args) throws Exception { string i = args[0]; .......... }在程序代码雷同的状况下,咱们用这份代码同时启动三个 JVM 过程,咱们临时将过程顺次命名为 a , b , c 。 ...

October 25, 2022 · 15 min · jiezi

关于linux-kernel:Uinput-Module

kernel/Documentation/input/uinput.rstIntroductionuinput是一个内核模块,能够从用户空间模仿输出设施。通过写入/dev/uinput(或 /dev/input/uinport)设施,过程能够创立具备特定性能的虚构输出设施。一旦创立了这个虚构设施,过程就能够通过它发送事件,这些事件将传递给用户空间和内核中事件消费者。 Interfacelinux/uinput.huinpu t头定义 ioctl 来创立、设置和销毁虚构设施。 libevdevlibevdev 是 evdev设施的包装库,它提供了创立 uinput设施和发送事件的接口。libevdev比间接拜访uinput 更不容易出错,新软件应该思考应用此形式。 无关 libevdev 的示例和更多信息: https://www.freedesktop.org/s... ExamplesKeyboard events 第一个示例演示了如何创立新的虚构设施,以及如何发送要害事件。为了简略起见,删除了所有默认导入和谬误处理程序。 #include <linux/uinput.h> void emit(int fd, int type, int code, int val) { struct input_event ie; ie.type = type; ie.code = code; ie.value = val; /* timestamp values below are ignored */ ie.time.tv_sec = 0; ie.time.tv_usec = 0; write(fd, &ie, sizeof(ie)); } int main(void) { struct uinput_setup usetup; int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); /* * The ioctls below will enable the device that is about to be * created, to pass key events, in this case the space key. */ ioctl(fd, UI_SET_EVBIT, EV_KEY); ioctl(fd, UI_SET_KEYBIT, KEY_SPACE); memset(&usetup, 0, sizeof(usetup)); usetup.id.bustype = BUS_USB; usetup.id.vendor = 0x1234; /* sample vendor */ usetup.id.product = 0x5678; /* sample product */ strcpy(usetup.name, "Example device"); ioctl(fd, UI_DEV_SETUP, &usetup); ioctl(fd, UI_DEV_CREATE); /* * On UI_DEV_CREATE the kernel will create the device node for this * device. We are inserting a pause here so that userspace has time * to detect, initialize the new device, and can start listening to * the event, otherwise it will not notice the event we are about * to send. This pause is only needed in our example code! */ sleep(1); /* Key press, report the event, send key release, and report again */ emit(fd, EV_KEY, KEY_SPACE, 1); emit(fd, EV_SYN, SYN_REPORT, 0); emit(fd, EV_KEY, KEY_SPACE, 0); emit(fd, EV_SYN, SYN_REPORT, 0); /* * Give userspace some time to read the events before we destroy the * device with UI_DEV_DESTROY. */ sleep(1); ioctl(fd, UI_DEV_DESTROY); close(fd); return 0; } Mouse movements ...

August 1, 2022 · 4 min · jiezi

关于linux-kernel:Multitouch-Protocol

Multi-touch Protocolkernel/Documentation/input/multi-touch-protocol.rst :Copyright: |copy| 2009-2010 Henrik Rydberg mailto:rydberg@euromail.se Introduction为了充分利用新的多点触控和多用户设施的全副性能,须要一种形式来上报多个触点(即与设施外表间接接触的对象)具体数据的办法。此文档形容了容许内核驱动程序报告任意数量的触点的详细信息的多点触控(MT)协定。 依据硬件的能力,此协定被分为了两种类型。对于解决匿名触点的设施(type A),此协定形容了如何将所有触点的原始数据发送给接收者。对于可能跟踪可辨认触点的设施(type B),此协定形容了如何通过event slot来发送单个触点的更新信息。 留神: type A多点触控协定曾经过期,所有的内核驱动程序都转用type B协定。 Protcol Usage触点的详细信息被作为独自的ABS_MT事件数据包程序发送,并且只有 ABS_MT 事件被辨认为触点数据包的一部分。 因为以后的单点触控 (ST) 应用程序疏忽了这些事件,因而能够在现有驱动程序中的 ST 协定之上实现 MT 协定。 type A设施的驱动程序通过在每个数据包的结尾调用input_mt_sync()来分隔触点数据包。这样会产生一个SYN_MT_REPORT事件来批示接管方接管以后触点的数据并筹备好接管下一个触点的数据。 type B设施通过在每个数据包的结尾调用input_mt_slot(),并以slot作为参数来分隔触点数据包。这样会产生一个ABS_MT_SLOT事件来批示接管方筹备更新给定的slot的信息。 所有的驱动程序都通过调用input_sync()函数来标记多点触控数据传输的完结。这批示接受者对上一次EV_SYN/SYN_REPORT事件当前的事件进行解决,并筹备好接管新的事件或者数据包。 无状态type A以及有状态type B的次要区别在于应用可辨认的触点来缩小发送到用户空间的数据。slot协定须要应用ABS_MT_TRACKING_ID,它由硬件提供或者通过原始数据计算得出。 对于type A类设施,驱动程序应该生成以后触屏上全副匿名触点的任意枚举。数据包在事件流中呈现的程序并不重要,事件过滤以及手指跟踪被留到了用户空间。 对于type B设施,驱动程序应该将每个可辨认的触点和一个slot关联,并用slot来更新触点的变动。通过批改触点关联的slot的ABS_MT_TRACKING_ID来创立,替换或者销毁触点。非负的ID被认为是无效的触点,-1示意未被应用的slot。 以前没有呈现的ID被认为是新的,不再呈现的ID被认为是曾经移出了的。因为只有扭转了的货色会被发送,因而每个触点的残缺状态必须驻留在接收端。 收到 MT 事件后,只需更新以后slot的相干的属性。 一些设施辨认和(或)跟踪的触点数量超过了它们能够向驱动程序报告的数量。此类设施的驱动程序应将一个 B 型slot与硬件报告的每个触点相关联。每当与slot关联的触点产生更改时,驱动程序应通过更改其ABS_MT_TRACKING_ID使该slot有效。如果硬件信号表明它正在跟踪的触点数量比以后报告的多,则驱动程序应应用 BTN_TOOL_*TAP 事件来告诉用户空间过后硬件正在跟踪的触点的数量。驱动程序应通过显式的发送相应的BTN_TOOL_*TAP事件并在调用input_mt_report_pointer_emulation()时将use_count设置为false来执行此操作。驱动程序应该只颁布硬件能够报告的尽可能多的slot。通过观察最大反对的 BTN_TOOL_*TAP 事件大于在 ABS_MT_SLOT 轴的 absinfo 中报告的 B 类slot的总数,用户空间能检测到驱动程序能够报告比插槽更多的总触点数。 ABS_MT_SLOT轴的最小值必须为0。 Protocol Example A:以下是type A设施双触点触摸的最小事件序列: ABS_MT_POSITION_X x[0] ABS_MT_POSITION_Y y[0] SYN_MT_REPORT ABS_MT_POSITION_X x[1] ABS_MT_POSITION_Y y[1] SYN_MT_REPORT SYN_REPORT挪动其中一个触点后的序列看起来完全相同;所有以后触点的原始数据在每次应用SYN_REPORT同步之间发送。 ...

August 1, 2022 · 2 min · jiezi

关于linux-kernel:如何在容器之中抓包

1.首先找到容器iddocker ps | grep pod名称 2.依据id找到容器PID(容器的实质是过程)docker inspect 容器id | grep Pid 3.进入容器过程的网络命名空间nsenter -t 容器PID -n bash 此时曾经处于容器的网络命名空间中了,验证一下ifconfig后会显示容器中的网络设备咱们的文件系统还是处于宿主机中,能够调用宿主机的工具,并且保留文件在宿主机的文件系统中

July 26, 2022 · 1 min · jiezi

关于linux-kernel:如何排查CPU网络中断软中断负载

排查命令# 查看网卡队列数ls /sys/class/net/网络设备名/queues/ | grep rx | wc -l# 查看CPU每秒解决中断速率mpstat -I SUM -P ALL 3# 查看网卡中断绑核状况cat /proc/interrupts | grep 网络设备名# 查看RPS开启状况cat /sys/class/net/eth*/queues/rx-*/rps_cpus# 查看RFS开启状况cat /proc/sys/net/core/rps_sock_flow_entriescat /sys/class/net/eth*/queues/rx-*/rps_flow_cnt

July 26, 2022 · 1 min · jiezi

关于linux-kernel:谁动了我的-CPU-频率-CPU-性能之迷-Part-2

目录: 为何有本文什么是动静 CPU 频率 什么是 p-stateLinux CPU 性能伸缩(CPU performance scaling) CPUFreq Policy(CPU 频率缩放策略)CPUFreq Policy 的 sysfs 文件接口 policy 通用属性通用的 Scaling Governor performance - Scaling Governorpowersave - Scaling Governor非 Intel CPU 的 Frequency Boost Support 非 Intel CPU 的 boost 的 sysfs 文件接口Intel CPU 的 Scaling Driver 操作模式 (Operation Modes) Active Mode Active Mode 且开启 HWP HWP + performanceHWP + powersaveActive Mode 且禁用 HWPPassive ModeTurbo P-states Support sysfs 中的 no_turbo 属性intel_pstate 的 sysfs 配置Global Attributes实时监控 CPU 理论频率 ...

June 29, 2022 · 15 min · jiezi

关于linux-kernel:linux对进程的读写量统计

struct task_struct有struct task_io_accounting ioac; struct task_io_accounting {#ifdef CONFIG_TASK_XACCT /* bytes read */ u64 rchar; /* bytes written */ u64 wchar; /* # of read syscalls */ u64 syscr; /* # of write syscalls */ u64 syscw;#endif /* CONFIG_TASK_XACCT */#ifdef CONFIG_TASK_IO_ACCOUNTING /* * The number of bytes which this task has caused to be read from * storage. */ u64 read_bytes; /* * The number of bytes which this task has caused, or shall cause to be * written to disk. */ u64 write_bytes; /* * A task can cause "negative" IO too. If this task truncates some * dirty pagecache, some IO which another task has been accounted for * (in its write_bytes) will not be happening. We _could_ just * subtract that from the truncating task's write_bytes, but there is * information loss in doing that. */ u64 cancelled_write_bytes;#endif /* CONFIG_TASK_IO_ACCOUNTING */};每个task_struct内嵌的write_bytes,统计是该过程写内存的字节数,这个写的,以后时刻可能还在内存外面,不肯定写到磁盘里了。 ...

May 1, 2022 · 2 min · jiezi

关于linux-kernel:scsiallocsgtables函数分析

scsi_alloc_sgtables函数剖析 struct scatterlist { unsigned long page_link; unsigned int offset; unsigned int length; dma_addr_t dma_address;#ifdef CONFIG_NEED_SG_DMA_LENGTH unsigned int dma_length;#endif};示意的是sg entry在内存中的地址和长度。page_link的作用:依据page_link的bit0和bit1的具体值(bit0 sg是否是链, bit1 sg是否是最初一个)。两种作用复用,一是示意sg entry指向的内存页page构造体,二是对于链起来的sg list,示意sg_table指向的下一个sg_table。一个内存页里,对应sg_table外面的各sg_entry是内存地址间断的(数组),如果sg list超过一个内存页,就得链起来。 /* * Notes on SG table design. * * We use the unsigned long page_link field in the scatterlist struct to place * the page pointer AND encode information about the sg table as well. The two * lower bits are reserved for this information. * * If bit 0 is set, then the page_link contains a pointer to the next sg * table list. Otherwise the next entry is at sg + 1. * * If bit 1 is set, then this sg entry is the last element in a list. * * See sg_next(). * */#define SG_CHAIN 0x01UL#define SG_END 0x02UL/* * We overload the LSB of the page pointer to indicate whether it's * a valid sg entry, or whether it points to the start of a new scatterlist. * Those low bits are there for everyone! (thanks mason :-) */#define sg_is_chain(sg) ((sg)->page_link & SG_CHAIN)#define sg_is_last(sg) ((sg)->page_link & SG_END)#define sg_chain_ptr(sg) \ ((struct scatterlist *) ((sg)->page_link & ~(SG_CHAIN | SG_END)))数组的sg_table: ...

April 17, 2022 · 3 min · jiezi

关于linux-kernel:block层数据完整性Data-Integrity

The integrity metadata (or protection information in SCSI terminology) includes a checksum for each sector as well as an incrementing counter that ensures the individual sectors are written in the right order.完整性元数据包含每个扇区的校验和及减少的用来确保每个扇区正确的写入程序的计数。 The SCSI Data Integrity Field works by appending 8 bytes of protection information to each sector. The data + integrity metadata is stored in 520 byte sectors on disk. Data + IMD are interleaved when transferred between the controller and target. The T13 proposal is similar.scsi的数据完整性字段,通过附加8字节的爱护信息到每个扇区来工作。数据和完整性元数据被贮存在磁盘上的520字节的扇区。在控制器和器件之间传输时,数据和完整性元数据被穿插读取。T13提案也相似。 ...

April 17, 2022 · 1 min · jiezi

关于linux-kernel:如何更快下载Linux-kernel代码

https://mirrors.tuna.tsinghua...

April 13, 2022 · 1 min · jiezi

关于linux-kernel:笨叔用4维空间来理解进程负载

微信公众号:奔跑吧Linux社区欢送订阅笨叔旗舰篇视频节目:https://weidian.com/?userid=1... 第二季更新视频啦明天咱们更新了两集第二季的视频节目,这两集视频节目都是和过程调度治理相干的代码剖析视频,咱们是基于Linux 5.0来解说代码的哟,没错,咱们视频是率领大家间接鲁5.0代码。咱们会在第一季+第二季旗舰篇视频里陆续更新Linux 5.0内核的代码剖析视频,不见不散! 过程代码剖析6 - 再谈SMP负载平衡用4维空间的角度来解说过程的负载 下面这个视频只是咱们这一期视频的一个预览片,全程1个多小时,有趣味的小伙伴能够点击浏览原文,进入笨叔微店订阅旗舰篇视频课程。咱们在上2个月和大家录制了两期的SMP负载平衡的代码剖析视频,那咱们这期节目还是持续和大家聊负载平衡,一方面是负载平衡 是过程治理里最简单的模块,波及的概念和代码量也比拟多,笨叔怕大家一时半会还没有齐全了解,所以咱们这期视频还是持续来聊负载平衡。 咱们在第一次smp负载平衡节目里,次要是和大家聊负载是怎么计算的,这个很重要,外面波及到很多公式和概念。这一期视频节目没看明确,前面的代码看起来也是十分吃力的。那我呢,在最近奔跑吧第二版订正过程中,对一些概念,从新做了一些订正,所以,这期视频,我会更新一下咱们最近对负载计算的思考,和我本人定义的一些新概念,不过,公式啥的,基本上都没变动,只是概念做了一些优化,次要是 怎么用中文,更好的形象和了解这些 公式和代码,咱们会4维空间的角度来解说负载这个概念。 第二次smp负载平衡节目里,咱们次要是讲 调度域和调度组的关系,这个也是很重要的,因为代码里如何去找一个闲暇的CPU和一个忙碌的CPU,这不是乱找的,是有法则的,这个法则就是遵循调度域和调度组的层次结构来,咱们稍后在和大家简略回顾一下。 咱们来扯一下物理学的4维空间。咱们晓得0维空间是点,一维空间是直线,两个点连起来就是一根直线。两条平行的线是不会相交的。两条不平行的线,他们有可能会在某个点相交。如果一个生命是在一条直线上,那么它就无奈和另外一条平行的直线上的生命相遇。那什么是二维空间呢,二维空间是几根线连起来的面,二维空间只有长和宽。而三维空间是啥呢,把立体卷起来,造成了一个三维的空间。三维空间是有长宽高,从而造成一个三维的,平面的空间。所以,三维空间能够了解为有有数的立体组成。比方,一个最强大脑里 常常常常玩的魔方,它就有好几个面组成了一个正方体。 那什么是4维空间,它们在工夫这个维度由很多的三维空间组成,所以4维空间多了工夫这个概念。咱们生存的4维空间是由无数个静止的三维空间 间断地,动静地,变动而成形成的。咱们就生存在这个动静的三维空间里。如果咱们把 工夫用宏观来看,你能够把它看成是由无数个宏观的三维空间组成的一个时间轴。其实,咱们人啊,是生存的4维空间里,你能看到三维的空间,你能感触到工夫的一分一秒的变动。咱们在时间轴是间断地匀速的变动,它不能减速,不能加速,不能静止,咱们人类无法控制这条工夫线。 还有的人说,人是生存在5维空间里,当人来到了地球,就去了五维空间了。 其实,咱们生存很多货色都是4维空间的,比如说,100块钱的一张纸币,它是一个动态的货色,你能够把它看成是一个3维空间外面的一个物体,它是静止的。然而呢,如果咱们把工夫思考进去,10年后,这个100块的购买力 就不是100块了,当初100块,你可能能够买30斤大米,3块3一斤大米,10年后可能只能买10斤大米了,这就是4维空间。它随着工夫的变动而变动的。扯蛋扯远了。咱们回到方才的问题,咱们发现间接使用权重,没有思考4维空间的影响,它只是停留在3维空间里,那当然是不准了,咱们现实生活是4维空间,必须把第4维空间,工夫这个因素思考进去。 Linux内核里应用了decay_avg_load的计算公式,为什么这里要应用decay这个货色呢?decay这个单词是衰减的意思。咱们还是从4维空间的角度来看。一个能量在时间轴里,它是会缓缓衰减的。比方咱们收回的声音,它就会随着工夫缓缓衰减,在几十米的中央基本上听不见了。在举个例子,方才提到的人民币购买力的状况,其实也是经济学上一种衰减,这个随着工夫的衰减是合乎经济法则的。比方,10几年前,上海一套房子单价才3~4千一平方米,当初基本上要涨到5~6,7~8w一平方米了,这阐明同样的一百块钱 随着时间推移,购买力的降落,这叫做通货膨胀。很多人在通过买房子或者投资股票来抵制通胀。很多人感觉一线城市的房子能够抵制通胀,然而很难了解股票为什么能抵制通胀,其实情理很简略,一个国家的GDP是由这个国家所有的公司来奉献的,那么那些好公司的业绩肯定是优于整个国家的GDP,GDP其实是一个平均值,所有公司的平均值。比方咱们当初GDP增长6~7%,那些头部的优质公司,它们的年增长率肯定大于6~7%,对吧。咱们在股市大跌或者低迷的时候,买入头部优质的公司长期持有,它们的业绩增长肯定是远远大于GDP,也大于M2的速度,这样就能够达到抵制通胀的目标,很多人没有把这个简略的4维空间的道现实明确,而是盯着k线图这个二维空间的图形来钻研股市,而后想着明天买今天卖,那当然是被割韭菜了。 过程代码导读7 - 实时性介绍和剖析很多人可能对实时性的概念有点含糊,什么是实时性?实时性是不是就是让零碎跑的更快的意思?是不是跑分更多?什么是硬实时?什么是软实时?Linux内核在关上了内核抢占性能之后,要达到硬实时规范,还有什么坎?咱们在视频里详细分析,实时性有哪些延时?产生延时的可能的起因是什么? 欢送订阅奔跑吧旗舰篇视频课程笨叔会持续录制基于Linux 5.0的代码剖析的视频课程,有趣味的同学能够微店或者淘宝店订阅笨叔的第一季+第二季旗舰篇视频,旗舰篇视频是继续不断更新的!一次订阅,继续更新!点击浏览原文,进入笨叔微店订阅旗舰篇视频课程。 蓝色奔跑吧第二版曾经交稿笨叔历时1年新订正的蓝色奔跑吧曾经交稿,第二版会新增很多新内容,而且大部分内容是从新重构的,第二版齐全基于Linux5.0 + ARM64/x86_64来编写的。书稿在3月初曾经交稿,请大家急躁期待。想看Linux 5.0的代码解说,能够订阅旗舰篇视频课程,笨叔会在视频里具体和大家剖析5.0代码的实现。 第二版具体目录请登录“奔跑吧linux社区”微信公众号,输出“奔跑吧第二版”索取。 全新的一套奔跑卷题目,有趣味同学能够登录“奔跑吧linux社区”微信公众号,输出“奔跑卷”索取。 本书预计2020年隆冬出版,到时候笨叔约大家吃西瓜,看奔跑吧!

April 3, 2022 · 1 min · jiezi

关于linux-kernel:MAC上用word写文档没visio咋画图

自从笨叔去年去美帝出差,被共事忽悠花了9000大洋买了一个MAC BOOK,传说美帝买MAC便宜,特地是俄勒冈州免税,再加上敌人的工卡能够打折,笨叔就这么上钩了 本认为MAC用起来很爽。然而,当笨叔装上MS Office之后,发现没有visio,傻眼了!该死的微软,为啥不给MAC开发一个visio!笨叔很土,平时写文档和写书稿都是用word,而后用visio画图,它们俩能够无缝对接。那MAC对笨叔来说就是一个玩具了。 听其余小伙伴说,在MAC上能够用draw.io来画图,而且draw.io有MAC本地装置软件包。 笨叔用draw.io画了一个简略图,试试。 画图的过程和visio差不多,很简略。可是怎么把图嵌入到word呢?傻眼了,总不能导出png图片再插入到word吧,那样图片会失真很多,有没有方法通过矢量图形式插入呢? 在draw.io官网上看到有word的插件。关上word,在插入页中关上利用商店。 搜寻draw,就能够找到draw.io插件。 关上draw.io插件。 抉择pick device file,就能够导入draw.io文件到word。 导入之后,发现图片是矢量图。 完满!笨叔感觉能够满足写书稿的需要。特地像笨叔这种又土又笨的人,到当初还用word,被用markdown的小伙伴鄙视了一把, 好消息:最新版本试验领导手册曾经悄悄的上线了 下载办法:在“奔跑吧linux社区”微信公众号里输出“试验领导手册”即可!

April 2, 2022 · 1 min · jiezi

关于linux-kernel:龙蜥开源Plugsched首次实现-Linux-kernel-调度器热升级-龙蜥技术

文/龙蜥社区内核开发人员 陈善佩、吴一昊、邓二伟 Plugsched 是 Linux 内核调度器子系统热降级的 SDK,它能够实现在不重启零碎、利用的状况下动静替换调度器子系统,毫秒级 downtime。Plugsched 能够对生产环境中的内核调度个性动静地进行增、删、改,以满足不同场景或利用的需要,且反对回滚。 基于 plugsched 实现的调度器热降级,不批改现有内核代码,就能取得较好的可批改能力,人造反对线上的老内核版本。如果提前在内核调度器代码的要害数据结构中退出 Reserve 字段,能够额定取得批改数据结构的能力,进一步晋升可批改能力。 Plugsched 开源链接:https://gitee.com/anolis/plug... 那么 Plugsched 诞生的背景或者想要解决的问题是什么?咱们认为有以下 4 点: 利用场景不同,最佳调度策略不同。 利用品种极大丰富,利用特色也是变幻无穷 (throughput-oriented workloads, s-scale latency critical workloads, soft real-time, and energy efficiency requirements),使得调度策略的优化比较复杂,不存在“一劳永逸”的策略。因而,容许用户定制调度器满足不同的场景是必要的。调度器迭代慢。 Linux 内核通过很多年的更新迭代,代码变得越来越沉重。调度器是内核最外围的子系统之一,它的结构复杂,与其它子系统严密耦合,这使得开发和调试变得越发艰难。此外,Linux 很少减少新的调度类,尤其是不太可能承受非通用或场景针对型的调度器,上游社区在调度畛域发展缓慢。内核降级艰难。调度器内嵌 (built-in)在内核中,上线调度器的优化或新个性须要降级内核版本。内核公布周期通常是数月之久,这将导致新的调度器无奈及时利用在生产零碎中。再者,要在集群范畴降级新内核,波及业务迁徙和停机降级,对业务方来说代价低廉。无奈降级子系统。kpatch 和 livepatch 是函数粒度的热降级计划,可批改能力较弱,不能实现简单的逻辑改变;eBPF 技术在内核网络中广泛应用,但当初调度器还不反对 ebpf hook,未来即便反对,也只是实现部分策略的灵便批改,可批改能力同样较弱。Plugsched 能将调度器子系统从内核中提取进去,以模块的模式对内核调度器进行热降级。通过对调度器模块的批改,可能针对不同业务定制化调度器,而且应用模块可能更麻利的开发新个性和优化点,并且能够在不中断业务的状况下上线。图1 plugsched: 业务不中断 应用 plugsched 具备以下 6 大劣势: 与内核公布解耦:调度器版本与内核版本解耦,不同业务能够应用不同调度策略;建设继续运维能力,减速调度问题修复、策略优化落地;晋升调度畛域翻新空间,放慢调度器技术演进和迭代可批改能力强 :能够实现简单的调度个性和优化策略,能人之所不能保护简略:不批改内核代码,或大量批改内核代码,放弃内核主线洁净整洁;在内核代码 Tree 外独立保护非通用调度策略,采纳 RPM 的模式公布和上线简略易用:容器化的 SDK 开发环境,一键生成 RPM,开发测试简洁高效向下兼容:反对老内核版本,使得存量业务也能及时享受新技术红利高效的性能:毫秒级 downtime,可疏忽的 overhead。Plugsched 利用案例Plugsched 相比 kpatch 和 livepatch 可批改能力更强,热降级范畴更广,plugsched 是子系统范畴的热降级,而后者是函数级别的热降级。对于 plugsched 而言,无论是 bugfix,还是性能优化,甚至是个性的增、删、改,都可胜任。鉴于 plugsched 较强的可批改能力,它可利用到以下场景: ...

April 1, 2022 · 3 min · jiezi

关于linux-kernel:Linux内核添加系统调用

我采纳的零碎是 Ubuntu20.04,内核版本为 5.10.56,体系结构为 x86_64。 增加零碎调用是在内核源码树中操作,所有版本的内核源代码都能够在Linux内核官方网站中找到,能够去自行下载。 1. 注册零碎调用号在 Linux 中,每个零碎调用都被赋予了一个零碎调用号。这样,通过这个举世无双的号就能够关联系统调用。当用户空间的过程执行一个零碎调用的时候,这个零碎调用号就用来指明到底是要执行哪个零碎调用;过程不会提及零碎调用的名称。 内核记录了零碎调用表中的所有已注册过的零碎调用的列表,存储在 sys_call_table 中。每一种体系结构中,都明确定义了这个表,在本零碎 x86_64 中,它定义于 arch/x86/entry/syscalls/syscall_64.tbl。 零碎调用表中每一项都以下由四个元素组成: <number> <abi> <name> <entry point> 其中,<num> 代表零碎调用号,例如在 x86_64 架构中 open 的零碎调用号就是 5;<abi> 即 x86_64 架构的 ABI,其含意 application binary interface(应用程序二进制接口);<name> 是零碎调用的名字;<entry point> 代表零碎调用在内核的接口函数,在 <name> 前加 sys_ 即可。 在零碎调用表中最初一项填入这四个元素即可注册零碎调用。 2. 申明零碎调用函数原型为了保障增加的零碎调用能被找到并且调用,须要在 include/linux/syscalls.h 中申明该零碎调用的函数原型。 每个零碎调用都对应一个内核服务例程来实现该零碎调用的具体性能,其命名格局都是以 sys_ 结尾。这是 Linux 中所有零碎调用都应该恪守的命名规定,例如零碎调用 bar() 在内核中也实现为 sys_bar() 函数。 函数申明中的 asmlinkage 限定词是一个编译指令,用于告诉编译器仅从堆栈中提取该函数的参数,而不是从寄存器中,因为在执行服务例程之前零碎曾经将通过寄存器传递过去的参数值压入内核堆栈了。所有的零碎调用都须要这个限定词。 其次,零碎调用函数返回值类型是 long。为了保障 32 位和 64 位零碎的兼容性,零碎调用在用户空间和内核空间有不同的返回值类型,在用户空间为 int,在内核空间为 long。 ...

March 25, 2022 · 1 min · jiezi

关于linux-kernel:内核编译指南

从0——1的内核编译当你接触到内核,你在真正的开始意识计算机 每次萌生入手玩内核的想法,但总是因为各式各样的花式借口放弃了,遂打算一点一点的记录下学习内核的过程,并将遇到的问题和大家分享。 如果你也想退出进来!欢送私信我,大家一起玩转内核 ! 为防止出错,我是从最开始的虚拟机开始部署,用的是Linux Ubuntu 20.04.2(最新出炉~~~)。但其实这并不障碍咱们,在任何的Linux零碎上都能够通用的解决内核编译的从0到1。 开整下载内核源码装置依赖解压源码配置内核编译和装置启用内核为疏导Let's Do It下载内核源码官网副品 内核源码下载条传送门: [kernel.org](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/refs/).命令行下载:wget https://git.kernel.org/torval...*.tar.gz( *** 代表的是你抉择Linux的版本号)正版尽管好,然而国内的下载速度的确是真的慢,换一下清华的源,速度会快很多! ==换源应该在下载源码前口头== vim /etc/apt/sources.listvim 关上软件源,将原文件做个备份,而后将文件替换为上面内容,应用 TUNA 的软件源镜像。 # 默认正文了源码镜像以进步 apt update 速度,如有须要可自行勾销正文deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse清华的kernel源码shell下载据点: ...

December 23, 2021 · 1 min · jiezi

关于linux-kernel:内核干货不容错过龙蜥内核的Load-Averages剖析直播回顾上线了

龙蜥社区 SIG 周会会邀请各个 SIG 组核心成员做技术分享。本文整顿自 Cloud Kernel SIG 双周会的分享,当初和大家一起回顾龙蜥内核的 Load Averages。Cloud Kernel SIG 是一款定制优化版的内核产品,在 Cloud Kernel 中实现了若干针对云基础设施和产品而优化的个性和改良性能,旨在进步云端和云下客户的应用体验。与其余 Linux 内核产品相似,Cloud Kernel 实践上能够运行于简直所有常见的 Linux 发行版中。Load Averages 作为一个经典的 Linux 零碎负载监控指标,在服务器数据中心被广泛应用。"龙蜥内核的 Load Averages 分析"系列分享邀请了 Cloud Kernel SIG 负责人庞训磊,深刻分析龙蜥内核的 Load Averages 原理细节,并分享在数据中心集群零碎遇到的各种 Load 抖动问题及心得体会。(现视频回放已上线至龙蜥官网-反对-视频,大家能够上官网查看。)本次直播分为高低两期: 上期:深刻分析了龙蜥内核的 Load 原理及实现,开篇展现了对 Linux Load 的直观意识,追溯 Load 定义的历史和规范由来,从数学原理上具体讲述了它背地的含意。接下来展现了 Linux 内核对 Load 实现的代码细节和挑战,并揭示了规范Linux Load实现的有余,以及龙蜥内核针对这些不足之处所做的自研补充。扫描图中二维码,可中转视频回放。(直播视频回放上)下期:数据中心集群里的 Load 高和随机抖动始终以来是一个困扰运维和零碎工程师的一大难题,本期分享了对于 Load 异样的线上实战心得,从经典计划、用户态计划和内核态计划等多维度进行比照实战,揭开了 Load 高和随机抖动问题的神秘面纱。(直播视频回放下) 对于课件获取形式: 关注公众号【OpenAnolis龙蜥】回复“龙蜥课件”即可收费获取,欢送大家多多浏览,多多交换。 视频回放链接地址: 上期: https://openanolis.cn/video/4... 下期:https://openanolis.cn/video/4...退出Cloud Kernel SIG:欢送更多开发者退出Cloud Kernel SIG: 网址:https://openanolis.cn/sig/Clo... ...

December 21, 2021 · 1 min · jiezi

关于linux-kernel:高通8155-音频数据从HAL到DSP

从数据流的角度整顿下安卓平台音频数据从HAL层达到DSP这个流程。 以 MultiMedia22 --> QUIN_TDM_RX_0 播放为例。 次要关注pcm数据写到dsp, 以及将前后端路由信息告知dsp两个点。 <!-- more --> [Platform:高通 8155 gvmq Android 11] [Kernel:msm-5.4] 代码可参考codeaurora 按如下形式下载 repo init -u https://source.codeaurora.org/quic/la/platform/manifest.git -b release -m LA.AU.1.3.2.r2-02600-sa8155_gvmq.0.xml --depth 1repo sync -c kernel/msm-5.4 platform/vendor/opensource/audio-kernel platform/hardware/qcom/audio platform/external/tinyalsa浏览本文最好对ALSA或者ASOC(ALSA System on Chip)有所理解,相干的文档可看下 <<Kernel Didr>>/Documentation/sound/soc/overview.rst及该目录下的文档, 或者网上搜一下有一大堆材料。 简略的说,Linux ASOC架构为了XXX目标,提出了一套这也牛逼那也高级还很省电(DAPM)的音频架构,当然也有全新的玩法和很多术语,从驱动角度来说,有三个局部比拟重要: Codec局部驱动 codec编解码芯片相干,比方其Mixer,管制,DAI接口,A/D,D/A等,这部分要求仅为codec通用局部,不蕴含任何平台或者机器相干代码,以不便运行在任何架构和机器(machine)上。Platform局部驱动 包含音频DMA,数字音频接口(DAI)驱动程序(例如I2S,AC97,PCM)和DSP驱动(高通有的文档把这DSP驱动独自拎进去,等同于CPU驱动),这部分也仅针对soc cpu,不得蕴含特定板级相干代码,也就是说也是机器(machine)无关的。Machine局部驱动 codec和platform都是与机器无关的,它们是绝对独立的两个局部,那谁把他们黏合在一起呢?这个工作就落在了machine上,它形容和绑定(dai link) 这些组件并实例化为声卡,蕴含有codec和platform特定相干代码。它能够解决任何机器特定的管制(GPIO, 中断, clocking, jacks, 电压等)和机器级音频事件(例如,在播放开始时关上speaker/hp放大器)。从数据流的角度来说,有两个概念比拟重要: FE-DAI Front-End DAI, 前端,对用户空间可见,为pcm设施,可通过mixer操作路由到后端,与后端连贯上,可路由到多个后端DAIs。BE-DAI Back-End DAI, 后端,对用户空间不可见,可路由到多个前端DAIs。前端和后端的可路由形式会有个路由表,规定了哪些可式可连上。 提到BE和FE DAI,不得不说的一个概念是 Dynamic PCM, 可看下文档 <<Kernel Didr>>/Documentation/sound/soc/dpcm.rst ,下图也出自该文档, ...

December 9, 2021 · 10 min · jiezi

关于linux-kernel:Linux-内核爆出权限提升漏洞UbuntuDebianFedora-均受影响

近日,平安钻研人员在 Linux 内核文件系统中发现了一个 size_t-to-int 类型转换破绽,并认为 2014 年以来的所有 Linux 内核版本均有可能受到影响。该破绽被命名为 Sequoia(编号 CVE-2021-33909),是一个权限晋升破绽,可使低权限用户取得 root 权限。 Sequoia 破绽的原理Linux 内核文件系统接口是一个层级架构,包含用户接口层、文件系统实现和存储设备驱动程序,是操作系统最重要的性能,在大多数 Linux 操作系统中极为广泛。 Linux 内核的 seq_file 接口产生蕴含记录序列的虚构文件,每个记录必须适宜 seq_file 缓冲区。当空间耗尽时,它只需将其体积翻倍即可扩充空间。然而,如果 size_t 变量被传递给 size 参数为 32 位整数而不是 size_t 的函数时,会产生什么呢?这正是 Sequoia 破绽的攻打原理。 来自 Qualys 的平安钻研人员示意:通过创立、挂载和删除一个总门路长度超过 1GB 的深层目录构造,并 open()s 和 read()s /proc/self/mountinfo,无特权的本地攻击者能够通过一系列其余操作实现内存越界写入。攻击者能够借此毁坏数据,使零碎解体,甚至执行未经受权的代码。 Qualys 钻研人员胜利利用该破绽,在 Ubuntu 20.04、Ubuntu 20.10、Ubuntu 21.04、Debian 11 和 Fedora 34 工作站的默认装置设置下取得了齐全的 root 权限。其余 Linux 发行版也有可能存在该破绽并被利用。 解决方案Qualys 团队于 6 月初发现该破绽,目前红帽曾经公布了补丁。7 月 20 日,Linux 内核维护者 Greg Kroah-Hartman 公布了 Linux 内核 5.13.4 版本针对 Sequoia 的内核补丁。 ...

July 22, 2021 · 1 min · jiezi

关于linux-kernel:Linux-kernel-514-来了13000-项提交删除全部遗留-IDE-代码

间隔Linux 内核 5.13 稳定版公布才两周,首个 Linux 内核 5.14 候选版本 (RC) 曾经诞生了。7 月 11 日,Linus Torvalds 公布 Linux 5.14-rc1,其两周的窗口合并期曾经完结。 Linus Torvalds 示意,Linux 5.14-rc1 版本曾经可用于公共测试。该版本包含来自约 1650 名开发人员的大概 13k 个提交,AMD GPU 硬件方面产生了很大变动。此外,该版本删除了遗留的 IDE 代码,当初所有 IDE 反对都基于 libata。 与所有新的内核版本一样,Linux 5.14 将带来驱动更新,以反对更多硬件设施。此外,新版本还有文件系统、架构、网络、调度、虚拟机方面有所改进,当然还有文档和工具更新。 Linux 内核 5.14 的最终版本应该会在八月底或 9 月初公布。像平常一样,这取决于在整个开发周期中有多少候选版本。 想要对该版本进行测试的同学,能够在 kernel.org 网站下载 Linux 5.14-rc1。然而这是一个预公布版本,并不适宜在生产机器上应用。 Linus Torvald 示意,“总的来说,我不认为这个版本带来任何微小惊喜。就规模而言,这仿佛也是很惯例的版本。咱们期待这是一个美妙而平静的公布周期,但将来的事件你无奈意料。” 参考链接: http://lkml.iu.edu/hypermail/...https://9to5linux.com/linus-t...

July 13, 2021 · 1 min · jiezi

关于tcp-ip:Linux-IP协议源码分析

IP协定 是网络的最重要局部,毫不夸大地说,正是因为有 IP协定 才有了互联网。而 IP协定 最重要的是 IP地址,IP地址 就如同咱们的家庭住址一样,用于其他人不便找到咱们的地位。 当然,这篇文章并不是介绍 IP协定 的原理,无关 IP协定 的原理能够参考经典的书籍《TCP/IP协定详解》,而这篇文章次要介绍的是 Linux 内核怎么实现 IP协定。 IP协定简介尽管咱们不会对 IP协定 做具体介绍,然而还是作个简略的介绍吧,不然间接剖析代码有点唐突。 如果有一台计算机A和一台计算机B,计算机A想与计算机B通信的话怎么办? 如果计算机A与计算机B是直连的,那么计算机A能够间接发送信息给计算机B,如下图: 所以,如果是直连的话,问题很容易解决。然而,大多数状况下,互联网上的计算机都不是直连的。试想一下,如果在中国的电脑如果要与美国的电脑发送音讯,那是不可能间接通过一条网线连贯的。 那么,互联网上的计算机之间是通过什么连贯的的?答案就是 路由器。如下图: 因为在互联网中,计算机与计算机之间不是直连的,所以两台计算机之间要通信的话不能间接发送音讯,因为不同的计算机之间不晓得对方的地位。 那么,有什么方法解决呢?咱们现实生活中,房子都有一个固定的地址,如:广东省广州市天河区林和西路98号,咱们能够通过这个地址找到对应的房子。所以,对应互联网上的计算机,咱们也能够人为的为其编上地址,名为 IP地址。 IP地址 由一个 32 位的整型数字示意,学过计算机科学的同学都指定,一个 32 位的整型数字可能示意的范畴为:0 ~ 4294967295。所以,IP地址 实践上可能反对 4294967296 台计算机上网(但事实上远远少于这个数,因为有很多地址用于非凡用处)。 然而,32 位的整型数字对人类的记忆不太敌对,所以,又将这个 32 位的整型数字分成 4 个 8 位的整型数字,而后用 点 将他们连接起来,如下图: 所以,IP地址 示意的范畴如下: 0.0.0.0 ~ 255.255.255.255咱们能够在 Windows 零碎的网络设置处查看到本机的 IP地址,如下图: 有了 IP地址 后,就能够为互联网上的每台计算机设置 IP地址,如下图: 这样,为每台计算机设置好 IP地址 后,不同计算机之间就能够通过 IP地址 来进行通信。比方,计算机A想与计算机D通信,那么就能够通过向 IP地址 为 11.11.1.1 的地址发送音讯。 ...

April 21, 2021 · 5 min · jiezi

关于linux内核模块:Linux-写时复制机制原理

在 Linux 零碎中,调用 fork 零碎调用创立子过程时,并不会把父过程所有占用的内存页复制一份,而是与父过程共用雷同的内存页,而当子过程或者父过程对内存页进行批改时才会进行复制 —— 这就是驰名的 写时复制 机制。 上面咱们将剖析 Linux 写时复制(Copy On Write) 机制的原理。 虚拟内存与物理内存过程的内存可分为 虚拟内存 和 物理内存。 物理内存:就是电脑装置的内存条,如果电脑装置了2GB的内存条,那么零碎就用于 0 ~ 2GB 的物理内存空间。虚拟内存:虚拟内存是应用软件虚构的,在 32 位操作系统中,每个过程都独占 4GB 的虚拟内存空间。应用程序应用的是 虚拟内存,比方 C 语言取地址操作符号 & 所失去的地址就是 虚拟内存地址。而 虚拟内存地址 须要映射到 物理内存地址 能力应用,如果应用没有映射的 虚拟内存地址,将会导致 缺页异样。 虚拟内存地址 映射到 物理内存地址 如下图所示: 如上图所示,过程A与过程B的雷同 虚拟内存地址 映射到不同的 物理内存地址,这就是不同过程的雷同虚拟内存地址互不影响的起因。 写时复制原理后面介绍了 虚拟内存 与 物理内存 的概念,接下来将会介绍 Linux 写时复制 的原理。 后面说过,虚拟内存 须要与 物理内存 进行映射能力应用,如果不同过程的 虚拟内存地址 映射到雷同的 物理内存地址,那么就实现了共享内存的机制。如下图所示: 因为过程A的 虚拟内存M 与过程B的 虚拟内存M' 映射到雷同的 物理内存G,所以当批改过程A 虚拟内存M 的数据时,过程B 虚拟内存M' 的数据也会跟着扭转。 ...

April 21, 2021 · 1 min · jiezi

关于linux-kernel:configfssamplec-理解

转载:https://www.cnblogs.com/sctb/...1. 编译运行代码从如下链接取得: https://github.com/torvalds/l...编写 Makefile 文件: obj-m += configfs_sample.oall: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean编译生成内核模块: makels -l -rwxr--r-- 1 abin abin 10K Oct 27 16:58 configfs_sample.c? -rw-rw-r-- 1 abin abin 13K Oct 29 11:16 configfs_sample.ko -rw-rw-r-- 1 abin abin 603 Oct 29 11:16 configfs_sample.mod.c -rw-rw-r-- 1 abin abin 2.6K Oct 29 11:16 configfs_sample.mod.o -rw-rw-r-- 1 abin abin 12K Oct 29 11:16 configfs_sample.o -rw-rw-r-- 1 abin abin 166 Oct 29 11:16 Makefile -rw-rw-r-- 1 abin abin 92 Oct 29 11:16 modules.order -rw-rw-r-- 1 abin abin 0 Oct 29 11:16 Module.symvers其中,configfs_sample.ko 使编译好的内核模块,应用如下命令加载该模块: ...

December 25, 2020 · 6 min · jiezi

关于linux-kernel:configfs用户空间控制的内核对象配置

转载:https://www.cnblogs.com/sctb/...互联网上的好货色越来越少,且看且珍惜,请尊重版权。 1. 什么是configfs?configfs 是一个基于内存的文件系统,它提供了与sysfs相同的性能。sysfs 是一个基于文件系统的内核对象视图,而configfs 是一个基于文件系统的内核对象管理器(或称为config_items)。 在 sysfs 中,一个对象在内核中被创立(例如,当内核发现一个设施时),并在 sysfs 中注册,而后它的属性会呈现在 sysfs 中,容许用户空间通过 readdir(3)/read(2) 读取,同时,也容许用户通过 write(2) 批改一些属性。很重要的一点,对象是在内核中被创立和销毁的,内核管制着 sysfs 示意内核对象的生命周期,而 sysfs 不能干涉。 configfs 的 config_item 是通过用户空间显式操作 mkdir(2) 创立, rmdir(2) 销毁的。对象的属性在 mkdir(2) 时呈现,并且能够通过 read(2) 和 write(2) 进行读取或批改。和 sysfs 一样,readdir(3) 能够查问 items 和属性的列表,symlink(2) 能够用来将 items 分组。与 sysfs 不同的是,configfs 示意的生命周期齐全由用户空间管制,反对这些 items 的内核模块必须对用户管制做出响应。 sysfs 和 configfs 应该同时存在于一个零碎中,任何一个都不能取代另一个。 2. 应用configfsconfigfs 能够编译为一个模块,也能够编译到内核中。你能够通过以下命令拜访它: sudo mount -t configfs none /sys/kernel/config/除非客户端模块也被加载,否则 configfs 树是空的。这些模块将它们的 item 类型作为子系统注册到 configfs 中,一旦客户端子系统被加载,它将作为一个(或多个)子目录呈现在 /sys/kernel/config/ 下。和 sysfs 一样,无论是否挂载在 /sys/kernel/config/ 上,configfs树始终存在。 ...

December 25, 2020 · 5 min · jiezi

41501034gcp内核TCP-SACK-BUG导致的请求无返回

起因某天更新发现某服务收到请求但客户端无法收到返回。幸运的是,客户端同学能在测试环境重现问题。2分法找到首个故障版本并进行了回退。故障版本仅仅修改了snd_buf,理论上不应导致该问题。 追查过程抓包判断故障端定位到服务端未返回15:27:52.589785 IP (tos 0x0, ttl 52, id 15592, offset 0, flags [DF], proto TCP (6), length 187) 106.11.0.208.26082 > XXX.12345: Flags [P.], cksum 0xfe51 (correct), seq 51:186, ack 104, win 347, options [nop,nop,TS val 94902541 ecr 3888443977], length 135E...<.@.4..Aj.......e.09..1........[.Q............I....s...K......}..[..KG.....N...r?[T....\"...U@q.3.O*M..5..........e...hx.1...43K7#.......<Gu..O..&qNX.o .....Z......?.s....q....N*.y..15:27:52.632302 IP (tos 0x0, ttl 63, id 13795, offset 0, flags [DF], proto TCP (6), length 52) XXX.12345 > 106.11.0.208.26082: Flags [.], cksum 0x6b54 (correct), seq 104, ack 186, win 224, options [nop,nop,TS val 3888446989 ecr 94902541], length 0E..45.@.?.......j...09e.......2(....kT............服务端调用了 :gen_tcp.send, 发送接口返回:ok. 为什么抓包无法抓到呢? ...

November 3, 2019 · 3 min · jiezi

Blog7-IO多路复用

引言结合文章我读过的最好的epoll讲解,认识select和epoll的基本工作原理。 假设:启动一个WEB服务,服务端每accept一个连接,在内核中就会生成一个相应的文件描述符。现在服务器成功建立了10个连接,我们需要知道其中哪些连接发送过来了新的数据,然后对其进行处理和响应。 通过一个基本的循环,我们就可以实现: while true: for x in open_connections: if has_new_input(x): process_input(x)这也是我们常用的“轮询”模式,不停的询问服务器“数据是否已经准备就绪”,而这非常浪费CPU的时间。 为了避免CPU的空转(无限的for循环),系统引入了一个select的代理。这个代理比较厉害,可以同时观察许多流的I/O事件。在空闲的时候,会把当前线程阻塞掉。当有一个或多个流有I/O事件时,就从阻塞态中醒来。于是,代码调整成这样: while true: select(open_connections) for x in open_connections: if has_new_input(x): process_input(x)调整之后,如果没有I/O事件产生,我们的程序就会阻塞在select处。但这样依然有个问题:我们从select那里仅仅知道,有I/O事件发生了,但却并不知道是那几个流(可能有一个,多个,甚至全部),我们只能无差别进行轮询,找出能读出或写入数据的流,对他们进行操作。使用select,我们有O(n)的无差别轮询复杂度,同时处理的流越多,每一次无差别轮询时间就越长。 epoll被用来优化select的问题,它会将哪个流发生了怎样的I/O事件通知我们。此时我们对这些流的操作都是有意义的(复杂度降低到了O(k),k为产生I/O事件流的个数)。最后,代码调整了这样: while true: active_conns = epoll(open_connections) for x in active_conns: process_input(x)I/O多路复用多路复用的本质是同步非阻塞I/O,多路复用的优势并不是单个连接处理的更快,而是在于能处理更多的连接。类似服务对外提供了一个批量接口。 I/O编程过程中,需要同时处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。 I/O多路复用技术通过把多个I/O的阻塞复用到同一个select阻塞上,一个进程监视多个描述符,一旦某个描述符就位, 能够通知程序进行读写操作。因为多路复用本质上是同步I/O,都需要应用程序在读写事件就绪后自己负责读写。 最大的优势是系统开销小,不需要创建和维护额外线程或进程。 结合多路复用,来看一下异步非阻塞I/O: 对比异步非阻塞I/O,读请求会立即返回,说明请求已经成功发起,应用程序不被阻塞,继续执行其它处理操作。当read响应到达,将数据拷贝到用户空间,产生信号或者执行一个基于线程回调函数完成I/O处理。应用程序不用在多个任务之间切换。 可以看出,阻塞I/O在wait for data和copy data from kernel to user两个阶段都是阻塞的。而只有异步I/O的receivefrom是不阻塞的。 epollepoll的系统调用方法包括:epoll_create、epoll_ctl、epoll_wait, epoll_create创建一个epoll对象:epollfd = epoll_create()epoll_ctl往epoll对象中增加/删除某一个流的某一个事件:// 有缓冲区内有数据时epoll_wait返回epoll_ctl(epollfd, EPOLL_CTL_ADD, socket, EPOLLIN);//缓冲区可写入时epoll_wait返回epoll_ctl(epollfd, EPOLL_CTL_DEL, socket, EPOLLOUT);epoll_wait等待直到注册的事件发生。Go语言go语法上提供了select语句,来实现多路复用。select语句中可以监听多个channel,只要其中任意一个channel有事件返回,select就会返回。否则,程序会一直阻塞在select上。通过结合default,还可以实现反复轮询的效果。 select {case <-tick: // Do nothing.case <-abort: fmt.Println("Launch aborted!") return}netpoll_epoll.go中实现的epoll方法,依次通过调用netpollinit、netpollopen、netpoll来实现。可能是调用太清晰了,整个文件除了下面的注释外,再也没有别的有效注释了。 ...

September 20, 2019 · 2 min · jiezi

面试必备进程同步机制内核自旋锁

进程(线程)间的同步机制是面试时的常见问题,所以准备用一个系列来好好整理下用户态与内核态的各种同步机制。本文就以内核空间的一种基础同步机制---自旋锁开始好了自旋锁是什么自旋锁就是一个二状态的原子(atomic)变量: unlockedlocked 当任务A希望访问被自旋锁保护的临界区(Critical Section),它首先需要这个自旋锁当前处于unlocked状态,然后它会去尝试获取(acquire)这个自旋锁(将这个变量状态修改为locked), 如果在这之后有另一个任务B同样希望去访问这段这段临界区,那么它必须要等到任务A释放(release)掉自旋锁才行,在这之前,任务B会一直等待此处,不段尝试获取(acquire),也就是我们说的自旋在这里。 自旋锁有什么特点如果被问到这个问题,不少人可能根据上面的定义也能总结出来了: "保护临界区""一直忙等待,直到锁被其他人释放""适合用在等待时间很短的场景中"说错了吗?当然没有!并且这些的确都是自旋锁的特点,那么更多呢 ? 几个基本概念为什么内核需要引入自旋锁?回答这个问题之前我想先简单引入以下几个基本概念: UP & SMPUP表示单处理器,SMP表示对称多处理器(多CPU)。一个处理器就视为一个执行单元,在任何一个时刻,只能运行在一个进程上下文或者中断上下文里。 中断(interrupt)中断可以发生在任务的指令过程中,如果中断处于使能,会从任务所处的进程上下文切换到中断上下文,在中断上下文中进行所谓的中断处理(ISR)。 内核中使用 local_irq_disable()或者local_irq_save(&flags)来去使能中断。两者的区别是后者会将当前的中断使能状态先保存到flags中。 相反,内核使用local_irq_enale()来无条件的使能中断,而使用local_irq_restore(&flags)来恢复之前的中断状态。 无论是开中断还是关中断的函数都有local前缀, 这表示开关中断的只在当前CPU生效。 内核态抢占(preempt)抢占,通俗的理解就是内核调度时,高优先级的任务从低优先的任务中抢到CPU的控制权,开始运行,其中又分为用户态抢占和内核态抢占, 本文需要关心的是内核态抢占。 早期版本(比2.6更早的)的内核还是非抢占式内核,也就是说当高优先级任务就绪时,除非低优先级任务主动放弃CPU(比如阻塞或者主动调用Schedule触发调度),否则高优先级任务是没有机会运行的。 而在此之后,内核可配置为抢占式内核(默认),在一些时机(比如说中断处理结束,返回内核空间时),会触发重新调度,此时高优先级的任务可以抢占原来占用CPU的低优先级任务。 需要特别指出的是,抢占同样需要中断处于打开状态! void __sched notrace preempt_schedule(void){ struct thread_info *ti = current_thread_info(); /* * If there is a non-zero preempt_count or interrupts are disabled, * we do not want to preempt the current task. Just return.. */ if (likely(ti->preempt_count || irqs_disabled())) return;上面代码中的 preempt_count表示当前任务是否可被抢占,0表示可以被抢占,而大于0表示不可以。而irqs_disabled用来看中断是否关闭。 内核中使用preemt_disbale()来禁止抢占,使用preempt_enable()来使能可抢占。 ...

June 18, 2019 · 2 min · jiezi

神奇的backlog参数对TCP连接建立的影响

曾经有人问我套接字编程中listen的第二个参数backlog是什么意思?多大的值合适?我不假思索地回答它表示服务器可以接受的并发请求的最大值。然而事实真的是这样的吗? TCP通过三次握手建立连接的过程应该都不陌生了。从服务器的角度看,它分为以下几步 将TCP状态设置为LISTEN状态,开启监听客户端的连接请求收到客户端发送的SYN报文后,TCP状态切换为SYN RECEIVED,并发送SYN ACK报文收到客户端发送的ACK报文后,TCP三次握手完成,状态切换为ESTABLISHED在Unix系统中,开启监听是通过listen完成。 int listen(int sockfd, int backlog)listen有两个参数,第一个参数sockfd表示要设置的套接字,本文主要关注的是其第二个参数backlog; <Unix 网络编程>将其描述为已完成的连接队列(ESTABLISHED)与未完成连接队列(SYN_RCVD)之和的上限。 一般我们将ESTABLISHED状态的连接称为全连接,而将SYN_RCVD状态的连接称为半连接 当服务器收到一个SYN后,它创建一个子连接加入到SYN_RCVD队列。在收到ACK后,它将这个子连接移动到ESTABLISHED队列。最后当用户调用accept()时,会将连接从ESTABLISHED队列取出。 是 Posix 不是 TCPlisten只是posix标准,不是TCP的标准!不是TCP标准就意味着不同的内核可以有自己独立的实现 POSIX是这么说的: The backlog argument provides a hint to the implementation which the implementation shall use to limit the number of outstanding connections in the socket's listen queue.Linux是什么行为呢 ? 查看listen的man page The behavior of the backlog argument on TCP sockets changed with Linux 2.2. Now it specifies the queue length for completely established sockets waiting to be accepted, instead of the number of incomplete connection requests.什么意思呢?就是说的在Linux 2.2以后, backlog只限制完成了三次握手,处于ESTABLISHED状态等待accept的子连接的数目了。 ...

May 21, 2019 · 3 min · jiezi

从虚拟化前端Bug学习分析Kernel-Dump

前言也许大家都知道,分析 Kernel Dump 有个常用的工具叫 Crash,在我刚开始学习分析 Kernel Dump 的时候,总是花大量的时间折腾这个工具的用法,却总是记不住这个工具的功能。后来有一次在参加某次内部分享的时候,有位大佬说了一句话让我印象非常深刻:这些工具怎么用的大家不用记,等到真正开始用的时候你就会猜到这个工具有什么功能。这篇文章我想通过分析一个实际的案例,尽量把学习Kernel Dump需要用到的知识串起来,虽然某些知识也许只会在这个案例中用到,但是我相信所用到的方法是可以应用到各个地方的。 起线上有一台 VM 宕机了,刚好有抓到 dump,拿到一台测试机上就可以开始分析了。首先需要的是 kernel 版本对应的 symbol,如果事先不知道 kernel 的版本,可以通过 `strings corefile | grep "Linux version"' 获取到当前 corefile 的 kernel 版本,例如 3.10.0-862.14.4.el7.x86_64 在获取到内核版本之后,根据相应的发行版以及系统架构到特定的 symbol 发布页面下载 symbol,这里的发行版是 Centos,可以到 http://debuginfo.centos.org/ 下载。如果是 Ubuntu 发行版,可以到 http://ddebs.ubuntu.com/ 下载。要找到指定 kernel 版本的 symbol 很简单,只需要拿着 kernel 版本 3.10.0-862.14.4.el7.x86_64 搜一下就能找到了,通常我们需要的 symbol 的只有下面这三个中的两个,但是我总是记不住是哪两个,所以我会把三个都下载下来并安装:kernel-debug-debuginfo-3.10.0-862.14.4.el7.x86_64.rpm、kernel-debuginfo-3.10.0-862.14.4.el7.x86_64.rpm、kernel-debuginfo-common-x86_64-3.10.0-862.14.4.el7.x86_64.rpm。在安装的时候由于依赖的关系需要先安装 common 的 symbol 才能安装其它 symbol,另外如果测试机上的 kernel 版本比 corefile 的版本新,需要加上 --force 选项才能安装上。 承在 symbol 安装完之后,就可以通过 crash 载入 corefile 和 symbol 了。 ...

April 23, 2019 · 6 min · jiezi

进程和线程

概念在学习操作系统的过程中,“进程”、“线程"概念其实很模糊。不同的上下文中,该名称指代的概念很可能是不同的,概念的不清晰为学习和沟通带来障碍,所以,在最开始我们先对齐概念。很多书籍、文章里会这样来定义进程和线程:进程:资源分配的最小单位;线程:程序执行的最小单位;其实这样的描述依然是不够具体的。一个执行中的程序,其实是由一组资源和(一个或者多个)执行实体组成的,每个执行实体需要自己执行过程中所必须的独有资源,所有的执行实体共享可共享资源。 这里的执行实体,就是线程;这里的执行实体和共享资源,就是进程。进程中的资源(用户)虚拟地址空间栈:(运行中的)局部变量、函数参数、返回地址等堆:动态分配的内存BSS 段:未初始化或初始值为 0 的全局变量和静态局部变量数据段:已初始化且初始值非 0 的全局变量和静态局部变量代码段:可执行代码、字符串字面值、只读变量文件描述符(File Descriptor)信号相关信号处理程序设置(这个设置可以在每个线程中设置,但是整个进程的所有线程对该设置共享,以最后一次设置为准)信号屏蔽设置信号量(这里的信号量跟上面的信号是两码事,上面的信号指的是中断,这里的信号量指的是进程间通信的一种机制)上述的所有资源中,加粗标记的为每个线程中独有的资源,未加粗的为所有线程共享的资源。关于虚拟地址空间,这里有张图比较方便我们理解。这张图的详细解释很多文章中会提到以下几个东西:子进程计数器和寄存器程序计数器(PC)寄存器指令寄存器(IR)地址寄存器这其中,进程关系在 Linux 中其实是使用独立的结构体进行存储的,通过内核提供的方法来获取,本质上不应该算是某种资源。其主体是内核 task_struct,后续我们会展开详细描述。 而计数器和寄存器是体系结构相关的硬件实现,处于执行中的执行实体(线程)会使用这些硬件,所以也不能算是某种资源。该段落拓展阅读:Linux虚拟地址空间布局文件描述符(File Descriptor)简介多线程信号总结Linux 对进程和线程的实现(5.0.0 内核)Linux 只有一个结构体来描述进程/线程—— task_struct,该文件位于 /linux/include/linux/sched.h。这一结构体中有字段指向/描述相关资源和相互之间的关系,因而,该结构体更应该认为是一个“线程结构体”,而“线程结构体”上的这些对于相关资源和相互之间关系的描述,则构成了“进程”。后面的笔记中会有对 task_struct 结构体的详细分析。参考Process - WikipediaThread - WikipediaLight-weight process - Wikipedia趣谈Linux操作系统 - 极客时间

April 13, 2019 · 1 min · jiezi

Perf分析CPU性能问题笔记

本文仅仅是一个笔记。场景观察进程的CPU使用情况观察进程内各个函数的CPU使用情况:sudo perf top -p <pid>同时显示函数调用链:sudo perf top -g -p <pid>记录采样结果,以供后续分析,加上-g会记录调用链:sudo perf record -g -p <pid>读取采样结果:sudo perf report观察容器内进程CPU使用情况容器内的进程实际上可以在host machine上看到,ps -ef | grep <text>可以找得到。因此同样可以用perf top -p <pid>观察,但是会出现无法显示函数符号的问题,注意观察perf top最下面一行:Failed to open /opt/bitnami/php/lib/php/extensions/opcache.so, continuing without symbols解决办法是先用perf record记录采样数据,然后将容器内文件系统绑定到host上,然后用perf report –symfs <path>指定符号目录。你得先安装bindfs(下面有安装方法)。mkdir /tmp/fooPID=$(docker inspect –format {{.State.Pid}} <container-name>)bindfs /proc/$PID/root /tmp/fooperf report –symfs /tmp/foo# 使用完成后不要忘记解除绑定umount /tmp/foo/把上面的<container-name>改成你要观察的容器名。观察Java进程的CPU使用情况你得要先安装perf-map-agent(下面有安装方法),在启动Java进程的时候添加-XX:+PreserveFramePointer参数,下面是几个用法:perf-java-top <pid> <perf-top-options>perf-java-record-stack <pid> <perf-record-options>perf-java-report-stack <pid> <perf-report-options>更多用法见官网说明。还可以使用perf-java-flames <pid> <perf-record-options>生成火焰图,你得先安装FlameGraph(下面有安装方法)。关于火焰图的解读看netflix的这篇博客。观察容器内Java进程CPU使用情况目前没有办法。附录:安装方法下面讲的都是在Ubuntu 16.04系统上的安装方法。perf安装perf$ sudo apt install -y linux-tools-common运行perf会出现:$ perfWARNING: perf not found for kernel 4.4.0-145 You may need to install the following packages for this specific kernel: linux-tools-4.4.0-145-generic linux-cloud-tools-4.4.0-145-generic You may also want to install one of the following packages to keep up to date: linux-tools-generic linux-cloud-tools-generic于是安装:sudo apt install linux-tools-4.4.0-145-generic linux-cloud-tools-4.4.0-145-generic linux-cloud-tools-genericbindfs到bindfs官网下载源码包(本文写是版本为1.13.11)。先安装编译需要的工具:sudo apt install -y cmake pkg-config libfuse-dev libfuse2 autoconf 解压缩源码包,进入bindfs目录,编译:./configure && make && sudo make installperf-map-agent到github clone perf-map-agent的源码仓库。安装JDK,你之后要监测的程序都得用这个JDK启动,这个JDK也用来编译perf-map-agent。用apt安装openjdk的方法见下面。编译:cmake .make# will create links to run scripts in /usr/local/binsudo bin/create-links-in /usr/local/bin安装openjdksudo apt-get install -y openjdk-8-jdk通过这种方式安装是没有JAVA_HOME环境变量的,因此我们要自己设置一个,查找openjdk的安装路径:dpkg-query -L openjdk-8-jdk将发现结果写到~/.bashrc里:export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64FlameGraph到github clone FlameGraph的源码仓库。到~/.bashrc设置环境变量:export FLAMEGRAPH_DIR=<path-to-flame-graph> ...

April 13, 2019 · 1 min · jiezi

Dart编译技术在服务端的探索和应用

前言最近闲鱼技术团队在Flutter+Dart的多端一体化的基础上,实现了FaaS研发模式。Dart吸取了其它高级语言设计的精华,例如Smalltalk的Image技术、JVM的HotSpot和Dart编译技术又师出同门。由Dart实现的语言容器,它可以在启动速度、运行性能有不错的表现。Dart提供了AoT、JIT的编译方式,JIT拥有Kernel和AppJIT的运行模式,此外服务端应用有各自不同的运行特点,那么如何选择合理的编译方法来提升应用的性能?接下来我们用一些有典型特点的案例来引入我们在Dart编译方案的实践和思考。案例详情相应的,我们准备了短周期应用(EmptyMain & Fibonnacci & faas_tool),长周期应用(HttpServer)分别来说明不同的编译方法在各种场景下的性能表现测试环境参考#实验机1Mac OS X 10.14.3 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz * 4 / 16GB RAM#实验机2Linux x86_64Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz * 4 / 8GB RAM#Dart版本Dart Ver. 2.2.1-edge.eeb8fc8ccdcef46e835993a22b3b48c0a2ccc6f1 #Java HotSpot版本Java build 1.8.0_121-b13 Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)#GCC版本Apple LLVM version 10.0.1 (clang-1001.0.46.3)Target: x86_64-apple-darwin18.2.0Thread model: posix短周期应用Case1. EmptyMain例子是一个空函数实现,以此来评估语言平台本身的启动性能,我们使用默认参数编译一个snapshot#1.默认条件下的app-jit snapshot生成dart snapshot-kind=app-jit snapshot=empty_main.snapshot empty_main.dart测试结果作为现代高级语言Dart和Java在启动速度上在同一水平线C语言的启动速度是其它语言的20x,基本原因是C没有Java、Dart语言平台的RuntimeKernel和AppJIT方式运行有稳定的微小差异,总体AppJIT优于KernelCase2. Fibonacci数列我们分别用C、Java、Dart用递归实现Fibonacci(50)数列,来考察编译工作对性能的影响。long fibo(long n){ if(n < 2){ return n; } return fibo(n - 1) + fibo(n - 2);}AppJIT使用优化阈值实现激进优化,这样编译器在Training Run中立即获得生成Optimized代码#2.执行激进优化 dart –no-background-compilation \ –optimization-counter-threshold=1 \ –snapshot-kind=app-jit \ –snapshot=fibonacci.snapshot fibonacci.dart将Fibonacci编译成Kernel#3.生成Kernel snapshotdart –snapshot=fibonacci.snapshot fibonacci.dartAoT的Runtime不在Dart SDK里,需要自行编译AoT Runtime#4.AoT编译pkg/vm/tools/precompiler2 fibonacci.dart fibonacci.aot#5.AoT的方式执行out/ReleaseX64/dart_precompiled_runtime fibonacci.aot测试结果Dart JIT对比下,AppJIT在激进优化后性能稍好于Kernel,差距微小,编译的成本占比可以忽略不计Dart AoT模式下的性能约为JIT的1/6不到JIT运行模式下,HotSpot的执行性能最优,优于Dart AppJIT 25%以上包括C语言在内的AoT运行模式性能均低于JIT,Dart AppJIT性能优于25%问题AoT由于自身的特性(和语言无关),无法在运行时基于Profile实现代码优化,峰值性能在此场景下要差很多,但是为何Dart VM比HotSpot有25%的差距?接下来我们针对Fibonacci做进一步优化#6.编译器调优,调整递归内联深度dart –inlining_recursion_depth_threshold=5 fibonacci.snapshot 50#7.编译器调优,HotSpot调整递归内联深度java -XX:MaxRecursiveInlineLevel=5 Fabbonacci 50测试结果HotSpot VM性能全面领先于Dart VM;两者在最优情况下HotSpot VM的性能优于Dart 9%左右Dart VM 借助JIT调优,性能有大幅提升,相比默认情况有40%左右的提升Dart AppJIT 性能微弱领先Kernel也许也不难想象JVM HotSpot目前在服务器开发领域上的相对Dart成熟,相比HotSpot,DartVM的“出厂设置”比较保守,当然我们也可以大胆猜测,在服务端应用下应该还有除JIT的其它优化空间;和Case1相同,Kernel模式的性能依然低于AppJIT,主要原因是Kernel在运行前期需要把AST转换为堆数据结构、经历Compile、Compile Optimize等过程,而在适当Training run后的AppJIT snapshot在VM启动时以优化后的IL(中间代码)执行,但很快Kernel会追上App-jit,最后性能保持持平。有兴趣的读者可以参阅Vyacheslav Egorov Dart VM的文章。Case3. FaaS容器编译工具在前面我们提到过Dart版本的FaaS语言容器,为追求极致的研发体验,我们需要缩短用户Function打包到部署运行的时间。就语言容器层面而言,Dart提供的Snapshot技术可以大大提升启动速度,但是从用户Function到Snapshot(如下图)生成所产生的编译时间在不做优化的情况下超过10秒,还远远达不到极致体验的要求。我们这里通过一些测试,来寻找提升性能的途径faas_tool是一个完全用Dart编写的代码编译、生成工具。依托于faas_tool, Function的编写者不用关心如何打包、接入中间件,faas_tool提供一系列的模版及代码生成工具可以将用户的使用成本降低,此外faas_tool还提供了HotReload机制可以快速响应变更。这次我们提供了基于AoT、Kernel、AppJIT的用例来执行Function构建流程,分别记录时间消耗、中间产物大小、产物生成时间。为了验证在JIT场景下DartVM是否可通过调整Complier的行为带来性能提升,我们增加了JIT的测试分组测试结果AoT>AppJIT>kernel,其中AoT比优化后的AppJIT有3倍左右性能提升,性能是Source的1000倍JIT(Kernel, AppJIT)分组下,通过在运行时减少CompilerOptimize或暂停PGO可以提升性能很显然faas_tool最终选择了AoT编译,但是性能结果和Case2大相径庭,为了搞清楚原因我们进一步做一下CPU ProfileCPU ProfileAppJITDart App-jit模式 43%以上的时间参与编译,当然取消代码优化,可以让编译时间大幅下降,在优化情况下可以将这个比率下降到13%KernelKernel模式有61%以上的CPU时间参与编译工作, 如果关闭JIT优化代码生成,性能有15%左右提升,反之进行激进优化将有1倍左右的性能损耗AoT下的编译成本AoT模式下在运行时几乎编译和优化成本(CompileOptimized、CompileUnoptimized、CompileUnoptimized 占比为0),直接以目标平台的代码执行,因此性能要好很多。P.S. DartVM 的Profile模块在后期的版本升级更改了Tag命名, 有需要进一步了解的读者参考VM Tags附:DartVM调优和命令代码#8.模拟单核并执行激进优化 dart –no-background-compilation \ –optimization-counter-threshold=1 \ tmp/faas_tool.snapshot.kernel #9.JIT下关闭优化代码生成dart –optimization-counter-threshold=-1 \ tmp/faas_tool.snapshot.kernel #10. Appjit verbose snapshotdart –print_snapshot_sizes \ –print_snapshot_sizes_verbose \ –deterministic \ –snapshot-kind=app-jit \ –snapshot=/tmp/faas_tool.snapshot faas_tool.dart #11.Profile CPU 和 timeline dart –profiler=true \ –startup_timeline=true \ –timeline_dir=/tmp \ –enable-vm-service \ –pause-isolates-on-exit faas_tool.snapshot长周期应用HttpServer我们用一个简单的Dart版的HttpServer作为典型长周期应用的测试用例,该用例中有JsonToObject、ObjectToJson的转换,然后response输出。我们分别用Source、Kernel以及AppJIT的方式在一定的并发量下运行一段时间void processReq(HttpRequest request){ try{ final List<Map<String,dynamic>> buf = <Map<String,dynamic>>[]; final Boss boss = new Boss(numOfEmployee: 10); //Json反序列化对象 getHeadCount(max: 20).forEach((hc){ boss.hire(hc.idType, hc.docId); buf.add(hc.toJson()); }); request.response.headers.add(‘cal’,’${boss.calc()}’); //Json对象转JsonString request.response.write(jsonEncode(buf)); request.response.close() .then((v) => counter_success ++) .timeout(new Duration(seconds:3)) .catchError((e) => counter_fail ++)); } catch(e){ request.response.statusCode = 500; counter_fail ++; request.response.close(); }}测试结果 上面三种无论是何种方式启动,最终的运行时性能趋向一致,编译成本在后期可以忽略不计,这也是JIT的运行特点在AppJIT模式下在应用启动起初就有接近峰值的性能,即使在Kernel模式下也需要时间预热达到峰值性能,Source模式下VM启动需要2秒以上,因此需要相对更长时间达到峰值性能。从另一方面看应用很快完成了预热,不久达到了峰值性能P.S. 长周期的应用Optimize Compiler会经过Optimize->Deoptimize->Reoptimize的过程, 由于此案例比较简单,没体现Deoptimize到Reoptimize的表现附:VM调优脚本#12.调整当前isolate的新生代大小,默认2M最大32M的新生代大小造成频繁的YGCdart –new_gen_semi_max_size=512 \ –new_gen_semi_initial_size=512 \ http_server.dart \ –interval=2 总结和展望Dart编译方式的选择编译成本为主导的应用,应优先考虑AoT来提高应用性能长周期的应用在启动后期编译成本可忽略,应该选择JIT方式并开启Optimize Compiler,让优化器介入长周期的应用可以选择Kernel的方式来提升启动速度,通过AppJIT的方式进一步缩短warmup时间AppJIT减少了编译预热的成本,这个特性非常适合对一些高并发应用在线扩容。Kernel作为Dart编译技术的前端,其平台无关性将继续作为整个Dart编译工具链的基础。在FaaS构建方案的选择通过CPU Profile得出faas_tool是一个编译成本主导的应用,最终选择了AoT编译方案,结果大大提升了语言容器的构建的构建速度,很好满足了faas对开发效率的诉求仍需改进的地方从JIT性能表现来看,DartVM JIT的运行时性和HotSpot相比有提升余地,由于Dart语言作为服务端开发的历史不长,也许随着Dart在服务端的技术应用全面推广,相信DarVM在编译器后端技术上对服务器级的处理器架构做更多优化。本文作者:闲鱼技术-无浩阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 11, 2019 · 2 min · jiezi

epoll 是如何工作的

本文包含以下内容:epoll是如何工作的本文不包含以下内容:epoll 的用法epoll 的缺陷我实在非常喜欢像epoll这样使用方便、原理不深却有大用处的东西,即使它可能已经比较老了select 和 poll 的缺点epoll 对于动辄需要处理上万连接的网络服务应用的意义可以说是革命性的。对于普通的本地应用,select 和 poll可能就很好用了,但对于像C10K这类高并发的网络场景,select 和 poll就捉襟见肘了。看看他们的APIint select(int nfds, fd_set readfds, fd_set writefds, fd_set exceptfds, struct timeval timeout); int poll(struct pollfd fds, nfds_t nfds, int timeout);它们有一个共同点,用户需要将监控的文件描述符集合打包当做参数传入,每次调用时,这个集合都会从用户空间拷贝到内核空间,这么做的原因是内核对这个集合是无记忆的。对于绝大部分应用,这是一种十足的浪费,因为应用需要监控的描述符在大部分时间内基本都是不变的,也许会有变化,但都不大.epoll 对此的改进epoll对此的改进也正是它的实现方式,它需要完成以下两件事描述符添加—内核可以记下用户关心哪些文件的哪些事件.事件发生—内核可以记下哪些文件的哪些事件真正发生了,当用户前来获取时,能把结果提供给用户.描述符添加既然要有记忆,那么理所当然的内核需要需要一个数据结构来记, 这个数据结构简单点就像下面这个图中的epoll_instance, 它有一个链表头,链表上的元素epoll_item就是用户添加上去的, 每一项都记录了描述符fd和感兴趣的事件组合event事件发生事件有多种类型, 其中POLLIN表示的可读事件是用户使用的最多的。比如:当一个TCP的socket收到报文,它会变得可读;当一个pipe受到对端发送的数据,它会变得可读;当一个timerfd对应的定时器超时,它会变得可读;那么现在需要将这些可读事件和前面的epoll_instance关联起来。linux中,每一个文件描述符在内核都有一个struct file结构对应, 这个struct file有一个private_data指针,根据文件的实际类型,它们指向不同的数据结构。那么我能想到的最方便的做法就是epoll_item中增加一个指向struct file的指针,在struct file中增加一个指回epoll item的指针。为了能记录有事件发生的文件,我们还需要在epoll_instance中增加一个就绪链表readylist,在private_data指针指向的各种数据结构中增加一个指针回指到 struct file,在epoll item中增加一个挂接点字段,当一个文件可读时,就把它对应的epoll item挂接到epoll_instance在这之后,用户通过系统调用下来读取readylist就可以知道哪些文件就绪了。好了,以上纯属我个人一拍脑袋想到的epoll大概的工作方式,其中一定包含不少缺陷。不过真实的epoll的实现思想上与上面也差不多,下面来说一下创建 epoll 实例如同上面的epoll_instance,内核需要一个数据结构保存记录用户的注册项,这个结构在内核中就是struct eventpoll, 当用户使用epoll_create(2)或者epoll_create1(2)时,内核fs/eventpoll.c实际就会创建一个这样的结构./ * Create the internal data structure (“struct eventpoll”). /error = ep_alloc(&ep);这个结构中比较重要的部分就是几个链表了,不过实例刚创建时它们都是空的,后续可以看到它们的作用epoll_create()最终会向用户返回一个文件描述符,用来方便用户之后操作该 epoll实例,所以在创建epoll实例之后,内核就会分配一个文件描述符fd和对应的struct file结构/ Creates all the items needed to setup an eventpoll file. That is, a file structure and a free file descriptor./fd = get_unused_fd_flags(O_RDWR | (flags & O_CLOEXEC));file = anon_inode_getfile("[eventpoll]", &eventpoll_fops, ep, O_RDWR | (flags & O_CLOEXEC));最后就是把它们和刚才的epoll实例 关联起来,然后向用户返回fdep->file = file;fd_install(fd, file);return fd;完成后,epoll实例 就成这样了。向 epoll 实例添加一个文件描述符用户可以通过 epoll_ctl(2)向 epoll实例 添加要监控的描述符和感兴趣的事件。如同前面的epoll item,内核实际创建的是一个叫struct epitem的结构作为注册表项。如下图所示为了在描述符很多时的也能有较高的搜索效率, epoll实例 以红黑树的形式来组织每个struct epitem (取代上面例子中链表)。struct epitem结构中ffd是用来记录关联文件的字段, 同时它也作为该表项添加到红黑树上的Key;rdllink的作用是当fd对应的文件准备好(关心的事件发生)时,内核会将它作为挂载点挂接到epoll实例中ep->rdllist链表上fllink的作用是作为挂载点挂接到fd对应的文件的file->f_tfile_llink链表上,一般这个链表最多只有一个元素,除非发生了dup。pwqlist是一个链表头,用来连接 poll wait queue。虽然它是链表,但其实链表上最多只会再挂接一个元素。创建struct epitem的代码在fs/evnetpoll.c的ep_insert()中if (!(epi = kmem_cache_alloc(epi_cache, GFP_KERNEL))) return -ENOMEM;之后会进行各个字段初始化/ Item initialization follow here … /INIT_LIST_HEAD(&epi->rdllink);INIT_LIST_HEAD(&epi->fllink);INIT_LIST_HEAD(&epi->pwqlist);epi->ep = ep;ep_set_ffd(&epi->ffd, tfile, fd);epi->event = event;epi->nwait = 0;epi->next = EP_UNACTIVE_PTR;然后是设置局部变量epqstruct ep_pqueue epq;epq.epi = epi;init_poll_funcptr(&epq.pt, ep_ptable_queue_proc);epq的数据结构是struct ep_pqueue,它是poll table的一层包装(加了一个struct epitem 的指针)struct ep_pqueue{ poll_table pt; struct epitem epi;}poll table包含一个函数和一个事件掩码typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct );typedef struct poll_table_struct { poll_queue_proc _qproc; unsigned long _key; // store the interested event masks}poll_table;这个poll table用在哪里呢 ? 答案是,用在了struct file_operations的poll操作 (这和本文开始说的selectpoll不是一个东西)struct file_operations { // code omitted… unsigned int (poll)(struct file, struct poll_table_struct); // code omitted…}不同的文件有不同poll实现方式, 但一般它们的实现方式差不多是下面这种形式static unsigned int XXXX_poll(struct file *file, poll_table *wait){ 私有数据 = file->private_data; unsigned int events = 0; poll_wait(file, &私有数据->wqh, wait); if (文件可读了) events |= POLLIN; return events;} 它们主要实现两个功能将XXX放到文件私有数据的等待队列上 (一般file->private_data中都有一个等待队列头wait_queue_head_t wqh), 至于XXX是啥,各种类型文件实现各异,取决于poll_table参数查询是否真的有事件了,若有则返回.有兴趣的读者可以 timerfd_poll() 或者 pipe_poll() 它们的实现poll_wait的实现很简单, 就是调用poll_table中设置的函数, 将文件私有的等待队列当作了参数.static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table p){ if (p && p->_qproc && wait_address) p->_qproc(filp, wait_address, p);} 回到 ep_insert()所以这里设置的poll_table就是ep_ptable_queue_proc().然后revents = ep_item_poll(epi, &epq.pt); 看其实现可以看到,其实就是主动去调用文件的poll函数. 这里以TCP socket文件为例好了(毕竟网络应用是最广泛的)/ * ep_item_poll -> sock_poll -> tcp_poll */unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait) { sock_poll_wait(file, sk_sleep(sk), wait); // will call poll_wait() // code omitted…}可以看到,最终还是调用到了poll_wait(),所以注册的ep_ptable_queue_proc()会执行 struct epitem *epi = ep_item_from_epqueue(pt); struct eppoll_entry *pwq; pwq = kmem_cache_alloc(pwq_cache, GFP_KERNEL)这里面, 又分配了一个struct eppoll_entry结构. 其实它和struct epitem 结构是一一对应的.随后就是一些初始化 init_waitqueue_func_entry(&pwq->wait, ep_poll_callback); // set func:ep_poll_callback pwq->whead = whead; pwq->base = epi; add_wait_queue(whead, &pwq->wait) list_add_tail(&pwq->llink, &epi->pwqlist); epi->nwait++; 这其中比较重要的是设置pwd->wait.func = ep_poll_callback。现在, struct epitem 和struct eppoll_entry的关系就像下面这样文件可读之后对于TCP socket, 当收到对端报文后,最初设置的sk->sk_data_ready函数将被调用void sock_init_data(struct socket *sock, struct sock *sk){ // code omitted… sk->sk_data_ready = sock_def_readable; // code omitted…}经过层层调用,最终会调用到 __wake_up_common 这里面会遍历挂在socket.wq上的等待队列上的函数static void __wake_up_common(wait_queue_head_t *q, unsigned int mode, int nr_exclusive, int wake_flags, void *key){ wait_queue_t *curr, *next; list_for_each_entry_safe(curr, next, &q->task_list, task_list) { unsigned flags = curr->flags; if (curr->func(curr, mode, wake_flags, key) && (flags & WQ_FLAG_EXCLUSIVE) && !–nr_exclusive) break; }} 于是, 顺着图中的这条红色轨迹, 就会调用到我们设置的ep_poll_callback,那么接下来就是要让epoll实例能够知有文件已经可读了先从入参中取出当前表项epi和ep struct epitem *epi = ep_item_from_wait(wait); struct eventpoll ep = epi->ep; 再把epi挂到ep的就绪队列if (!ep_is_linked(&epi->rdllink)) { list_add_tail(&epi->rdllink, &ep->rdllist) } 接着唤醒阻塞在(如果有)该epoll实例的用户.waitqueue_active(&ep->wq) 用户获取事件谁有可能阻塞在epoll实例的等待队列上呢? 当然就是使用epoll_wait来从epoll实例获取发生了感兴趣事件的的描述符的用户.epoll_wait会调用到ep_poll()函数.if (!ep_events_available(ep)) { / * We don’t have any available event to return to the caller. * We need to sleep here, and we will be wake up by * ep_poll_callback() when events will become available. */ init_waitqueue_entry(&wait, current); __add_wait_queue_exclusive(&ep->wq, &wait); 如果没有事件,我们就将自己挂在epoll实例的等待队列上然后睡去…..如果有事件,那么我们就要将事件返回给用户ep_send_events(ep, events, maxevents) 参考资料the-implementation-of-epoll ...

March 15, 2019 · 3 min · jiezi

在CommunityBridge上推出Linux内核指导计划

作者:Shuah Khan当Jim Zemlin邀请我来Linux基金会作为Linux研究员,从事指导计划和提高Linux安全性时,我马上答应。我非常高兴能够在Linux基金会,与才华横溢,敬业奉献的人一起工作。这是一个独特而特殊的机会,可以分享我的知识和热情,帮助有抱负的开发者,感受成为世界上最大的开源项目的一部分的喜悦。为Linux内核做贡献,并在开源中工作是我的热情所在。能够成为影响和触动世界上每个人的软件的贡献者是一种荣幸,无论他们是否知道。作为改变我们沟通方式、开展业务、学习和互动的方式的一部分,我和全世界成千上万的开发者一起自豪地分享了作为Linux社区的一分子。我作为Linux内核贡献者的旅程开始是一个有趣的实验,帮助获取Android代码并使其成为核心Linux项目的一部分。我喜欢成为社区一员的经历,并开始寻找更多参与其中的机会。当Greg Kroah-Hartman寻找志愿者来帮助他完成稳定的维护工作时,我报了名。当我继续在内核社区工作时,Greg让我通过维护Linux Kselftest子系统来帮助完成提高Linux内核质量的任务。这使我有机会与在内核的各个部分拥有丰富经验的开发者和维护者合作。它让我保持警惕,为我提供了一个学习和帮助加强Linux内核质量和验证工作的巨大机会。此外,我协助稳定版本维护者,维护USB over IP、cpupower工具,贡献Linux媒体子系统,我在内核技术顾问委员会服务。像许多开源人士一样,我相信分享我的知识和专业。指导开发者是成为维护者和开源好公民的重要工作。任何社区都必须花时间和精力培养新的人才,并培养下一代领导者,以实现持续的成功。我发现Linux内核社区对于像我这样不同背景的人来说是一个非常热情的地方。我有很棒的导师,他们抽出时间帮助我找到我在社区中的位置,并将其作为我的家。我期待与社区分享我的经验,帮助新人克服他们的担忧,如果有的话,帮助他们在这个社区找到一个地方并有宾至如归的感觉。自从加入Linux基金会以来,我一直在努力建立新的指导计划。今天,我很高兴地宣布我们在CommunityBridge上推出新的Linux内核导师计划(Linux Kernel Mentorship Program),这个平台将为新开发者带来加入和学习社区的机会并同时进行改进。CommunityBridge是一个内核导师可以注册以分享他们的专业知识的地方,并将他们与具有申请工作的基本技能的任何人配对,作为选定的受指导者从我们的社区中学习。CommunityBridge将为个人,提供获得5500美元加上500美元旅行津贴的机会,为期12周的计划,向我们学习并解决诸如查找和修复,将使内核更加稳定和安全的错误等问题。在该计划结束时,受指导者还将与CommunityBridge雇主配对,以便有机会面试一些技术领域的知名公司。重要的是,为了改善我们社区的多样性,Linux基金会将在今年4月开始的夏季环节为来自不同背景的前5名学员提供全额资助。更重要的是,Linux基金会将以一兑一的方式进行匹配捐赠,以支持在CommunityBridge平台上托管的所有项目中的前100名来自不同背景的学员。简而言之,我们可以改进内核代码,将新人带入我们的社区,并为来自不同背景的有抱负的开发者找到工作机会,所有这些都在CommunityBridge上一同发生。我想邀请学员今天就通过申请CommunityBridge的计划,与专家作为指导和导师开始你的开源之旅。我敦促社区合作伙伴尽早捐赠给Linux内核指导计划,以确保Linux Kernel项目的LF匹配捐赠。请与我一起努力使Linux内核变得强大、多样和安全。对于内核以外的重要开源项目,我鼓励你利用CommunityBridge来改善你的社区。KubeCon + CloudNativeCon + Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon + Open Source Summit赞助方案KubeCon + CloudNativeCon + Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon + Open Source Summit购票窗口,立即购票!CNCF邀请你加入最终用户社区

March 14, 2019 · 1 min · jiezi

CIP宣布推出新的超长期支持Kernel,推动自动化、机器学习和人工智能

作者:maemalynn新的CIP SLTS Kernel扩展了支持架构以包含ARM64旧金山 - 2019年2月25日 - 通过工业级开源软件组件、工具和方法实现基础设施系统长期管理的CIP(Civil Infrastructure Platform)项目,今天宣布推出Super Long Term Support(SLTS) Kernel。新内核扩展了对64位Arm®Cortex的架构支持,使开发者能够在各种用例中使用它,包括楼宇自动化、机器学习和人工智能。随着对可靠性、连接性和功能丰富性的要求提高,实施和维护民用基础设施系统所需的软件数量已经增长到前所未有的水平。这些系统是现代社会的基础,无处不在负责全球社区和行业的基础设施监督、控制和管理。有了这些要求,安全性、保安性和可靠性要求面临着独特的挑战,因为需要不断进行更新。CIP由Linux基金会托管,旨在通过工业级软件和通用操作系统加速基于Linux的民用基础设施系统的实施,以现有的开源组织和专业知识为基础,通过提供基础层参考实施,建立事实上的标准,以及有助于并影响有关工业需求的上游项目。“我们每天依靠技术系统来保证我们的安全。这些基于Linux的系统通常需要维护十年以上。”CIP技术指导委员会主席兼东芝公司开源技术部高级经理Yoshitake Kobayashi表示。“对我们来说,更好地准备我们的民用基础设施系统至关重要,SLTS CIP内核使我们在长达数十年的时间里向可持续发展迈进了一步。随着对Arm64的新支持,内核可以应用于更广泛的应用程序,这些应用程序是我们生活的未来支柱。”跨行业合作与发展实时Linux是工业级系统的关键组件。除了实时管理和数据之外,工业系统还需要安全性、保安性和可靠性,这就是为什么CIP计划与Linux基金会新的安全应用Linux启用项目(ELISA)合作的原因。ELISA是一个开源项目,旨在创建一组共享的工具和流程,以帮助公司构建和认证基于Linux的安全关键应用程序和系统,这些应用程序和系统的故障可能导致人命损失、重大财产损失或环境破坏。通过SIL2LinuxMP项目和Real-Time Linux项目完成的工作,ELISA将使公司更容易构建安全关键系统,如使用Linux的机器人设备、医疗设备、智能工厂、运输系统和自动驾驶。“对于在工业和基础设施环境中运行的嵌入式系统所需的安全性、保安性和可靠性,长期维护和支持至关重要。”Linux基金会策略计划高级总监Kate Stewart说。“通过ELISA,我们正在与更广泛的Linux基金会社区合作,如CIP,以使这一举措取得成功。我们期待与CIP及其成员合作,建立流程和工具,以支持基于Linux的安全关键应用程序的认证。”CIP还启动了两个新的工作组来帮助管理开发过程的特定方面。安全工作组将使用各种安全标准来帮助解决网络安全问题。在瑞萨电子的领导下,工作组的重点是供应商使用IEC 62443-4-x标准进行认证,这是工业产品最重要的安全规范之一。他们将通过对各种可用标准进行认证,使CIP平台保持最新,并通过创建明确定义的认证流程,最大限度地缩短供应商的开发时间和成本。软件更新工作组将提供强大的软件更新工具,集成并加强工业级开源基础层。在东芝公司的带领下,工作组将专注于软件架构,将所选软件集成到CIP Core使用的Linux镜像构建工具中,并实现软件更新参考板。CIP由一些世界上最具创新性的行业领导者推动,如Codethink、Cybertrust、日立、Moxa、Plat’Home、瑞萨、西门子和东芝,并与其他开源项目密切合作,如Linux Kernel LTS、Debian Project、KernelCI。许多成员计划支持SLTS CIP内核,包括瑞萨最近发布了RZ/G2 MPU,它将作为Arm64的参考硬件,用于CIP Linux软件包的认证和发布。可以在此处找到CIP SLTS内核的源文件:https://git.kernel.org/pub/sc…其他CIP资源:CIP网站:https://www.cip-project.org/CIP Wiki页面:https://wiki.linuxfoundation….CIP Core:https://www.cip-project.org/b…Board At Desk:https://www.cip-project.org/b…关于CIPCivil Infrastructure Platform(CIP)是由Linux Foundation托管的开源项目。该项目的重点是建立一个工业级软件的开源基础层,以支持使用和实施可重复使用的软件构建模块,以满足工业和民用基础设施的安全性、可靠性和其他要求。有关其他信息,请到https://www.cip-project.org/。KubeCon + CloudNativeCon和Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon和Open Source Summit赞助方案KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon和Open Source Summit购票窗口,立即购票!

March 5, 2019 · 1 min · jiezi

[个人笔记] 关于linux的常见问题合集

关于linux的常见问题合集,有技术问题,上 bug200.com如何设置文件夹及其所有子文件夹和文件的chmod?有什么方法可以设置吗chmod 755对于/opt/lampp/htdocs它的所有内容包括子文件夹和文件? 将来,如果我在htdocs,如何将其权限自动设置为755? 此操作有效,但仅适用于此文件夹: chmod 775 /opt/lampp/htdocs如何将包含文件的文件夹复制到UNIX/Linux中的另一个文件夹?我有一些问题要将文件夹中包含文件的文件夹复制到另一个文件夹中。命令cp -r不复制文件夹中的文件。如何根据通配符匹配递归查找当前和子文件夹中的所有文件?如何根据通配符匹配递归查找当前和子文件夹中的所有文件?chmod 777到文件夹和所有内容这个问题已经有了答案: How do I set chmod for a folder and all of its subfolders and files? [closed] 16答如何从终端窗口在Linux中创建文件?在Linux终端中创建文件最简单的方法是什么?如何递归地grep?如何递归grep所有目录和子目录? find . | xargs grep “texthere” 错误:无法找到或加载主类这个问题已经有了答案: What does “Could not find or load main class” mean? 41答如何在Linux/Unix上永久设置$path?我正在尝试向路径中添加一个目录,以便它始终位于我的Linux路径中。我试过了: export PATH=$PATH:/path/to/dir 但是,每次我退出终端并启动一个新的终端实例时,这个路径都会丢失,我需要再次运行export命令。 我该怎么做才能永久设置?循环访问bash中的文件内容如何迭代文本文件的每一行Bash? 使用此脚本: echo “Start!” for p in (peptides.txt) do echo “${p}” done 我在屏幕上得到这个输出: Start! ./runPep.sh: line 3: syntax error near unexpected token (’ ./runPep.sh: line 3: (后来我想做一些更复杂终止分离的屏幕会话我从某个地方学到一个独立的屏幕可以被 screen-x-s[session you want to kill]杀戮 可以从中获取[你想杀死的会话] 屏幕LS . 但这不管用。有什么问题吗?正确的方法是什么?如何在终端中获取当前日期和时间,并在终端中为其设置自定义命令?我必须在Linux终端中检查时间。在Linux终端中,获取日期和时间的命令是什么?有什么方法可以设置自定义函数吗?如何使用ssh从服务器下载文件?我需要从服务器下载一个文件到我的桌面。(Ubuntu10.04)我没有访问服务器的网络,只有ssh。 如果有帮助,我的操作系统是Mac OS X和iTerm 2作为终端。丢失的httpd.conf文件位于apache我怎么能找到我的httpd.conf是否找到文件? 我在AmazonWebServicesEC2(弹性计算云)上运行UbuntuLinux服务器,找不到我的apache配置。睡眠数毫秒我知道这个姿势sleep(x)函数使程序休眠x秒。有使程序休眠x的功能吗毫秒在C++中?如何计算文档中的行数?我有这样的线条,我想知道我有多少线条… 09:16:39 AM all 2.00 0.00 4.00 0.00 0.00 0.00 0.00 0.00 94.00 09:16:40 AM all 5.00 0.00 0.00 4.00 0.00 0.00 0.00 0.00 91.00 09将所有输出重定向到文件这个问题已经有了答案: How can I redirect and append both stdout and stderr to a file with Bash? 6答是否有列出所有Unix组名的命令?我知道有/etc/group列出所有用户组的文件。 我想知道是否有一个简单的命令列出所有用户组名称,尽管解析世界可读/etc/group文件。我愿意创建一个列出Linux帐户组名的管理员网页。加载共享库时发生Linux错误:无法打开共享对象文件:没有此类文件或目录该程序是Xenomai测试套件的一部分,从Linux PC交叉编译到Linux+Xenomai ARM工具链中。 # echo $LD_LIBRARY_PATH删除指向目录的符号链接我有一个重要目录的符号链接。我想去掉这个符号链接,同时把目录放在后面。 我试过rm然后回来rm: cannot remove ‘foo’.我试过rmdir回来了rmdir: failed to remove ‘foo’: Directory not empty然后我通过rm -f,rm -rf和sudo rm -rf 然后我去找我的备份。 有没有一种方法可以摆脱这个符号链接,把婴儿和洗澡水一起扔掉如何在Linux中列出具有绝对路径的文件?[关闭]我想生成具有完整路径的递归文件列表 /home/ken/foo/bar 但据我所知ls和find只提供相对路径列表 ./foo/bar (from the folder ken) 这似乎是一个明显的要求,但我看不到find或ls人页。[http post and get using curl in linux[duplicate]](https://bug200.com/post/14978…这个问题已经有了答案: How to send a header using a HTTP request through a curl call? 7答如何在启动时运行shell脚本在AmazonLinux实例上,我有两个脚本start_my_app和stop_my_app哪个开始和停止forever(反过来运行node.js应用程序)。我使用这些脚本手动启动和停止我的节点应用程序。到现在为止,一直都还不错。 我的问题是:我还想把它设置成start_my_app在系统启动时运行。我知道我需要在里面添加一个文件init.d我知道如何将其符号链接到rc.d但无法确定我放入的文件中如何在不确认的情况下强制CP覆盖我正在尝试使用cp命令并强制覆盖。 我试过了cp -rf /foo/ /bar,但仍然提示我确认每个覆盖。如何排除查找中的目录。命令我在试着运行一个find所有javascript文件的命令,但如何排除特定目录? 这里是find我们使用的代码。 for file in $(find . -name ‘.js’) do java -jar config/yuicompressor-2.4.2.jar –type js $file -o $file done如何删除导出的环境变量?在安装gnuplot之前,我设置了环境变量GNUPLOT_DRIVER_DIR = /home/gnuplot/build/src. 在安装过程中,出了点问题。 我想把GNUPLOT_DRIVER_DIR环境变量。我怎样才能做到?tar目录的shell命令,不包括某些文件/文件夹是否有一个简单的shell命令/脚本支持从存档中排除某些文件/文件夹? 我有一个目录需要用一个子目录归档,该子目录包含许多我不需要备份的非常大的文件。 不完全解决方案: 这个tar –exclude=PATTERN命令匹配给定的模式并排除这些文件,但我需要忽略特定的文件和文件夹(完整的文件路径),否则可能会排除有效的文件。 我也可以使用find命令创建一个文件列表,排除那些我不想归档的文件,并将如何将node.js作为后台进程运行,永不死机?我通过putty ssh连接到Linux服务器。我尝试将其作为后台进程运行,如下所示: $ node server.js & 但是,2.5小时后,终端将变为非活动状态,进程将停止。在终端断开连接的情况下,是否仍可以保持进程的活动状态? 编辑1 实际上,我试过nohup但是,一旦我关闭Putty ssh终端或拔下互联网插头,服务器进程就会立即停止。 我在油灰里有什么事要做吗? 编辑2(如何获取文件的完整路径?有什么简单的方法可以打印file.txt? file.txt = /nfs/an/disks/jj/home/dir/file.txt 这个<command> dir> <command> file.txt 应该打印 /nfs/an/disks/jj/home/dir/file.txtusr/bin/ld:找不到-l<name数据库>我正在编译程序,它返回以下错误: usr/bin/ld: cannot find -l<nameOfTheLibrary> 在makefile中,我使用命令g++以及指向我的库的链接,这是指向位于其他目录上的库的符号链接。 是否可以添加选项以使其正常工作?错误1045(28000):用户&39;根&39;@&39;本地主机&39的访问被拒绝;(使用密码:是)我是一个电气工程师,主要是玩电力系统,而不是编程。最近,我一直在遵循一个手册,在Ubuntu上安装一个软件套件。我不知道mySQL实际上。我已经在我的Ubuntu上完成了以下安装。 sudo apt-get update sudo apt-get install mysql-server-5.5 sudo apt-get install mysql-client-5.5 sudo apt-get如何将stdout和stderr重定向并附加到带有bash的文件中?重定向标准输出对于bash中的截断文件,我知道使用: cmd > file.txt 重定向标准输出在bash中,附加到一个文件后,我知道要使用: cmd >> file.txt 同时重定向标准输出和标准错误对于截断的文件,我知道使用: cmd &> file.txt 我如何重定向两者标准输出和标准错误附加到文件?cmd &>> file.t如何找到mysql my.cnf位置是否有mysql命令来定位my.cnf配置文件,类似于php的phpinfo()其定位php.ini?如何在Linux中设置环境变量ld_library_path我首先执行了命令:export LD_LIBRARY_PATH=/usr/local/lib 然后我打开了.bash_profile文件:vi ~/.bash_profile. 在这个文件中,我把: LD_LIBRARY_PATH=/usr/local/lib export LD_LIBRARY_PATH 然后,如果终端关闭并重新启动,则键入echo $LD_LIBRARY_PATH不显示结果。使用ls列出目录及其总大小可以用吗ls在Unix中,要列出子目录及其所有内容的总大小,而不是通常的4K(我假设)只是目录文件本身?即。 total 12K drwxrwxr-x 6 4.0K 2009-06-19 10:10 branches drwxrwxr-x 13 4.0K 2009-06-19 10:52 tags drwxrwxr-x 16 4.0K 2009-0ld找不到现有库我正试图将一个应用程序与这个Debian-Lenny系统上的G++链接起来。ld抱怨找不到指定的库。这里的具体示例是ImageMagick,但我也遇到了一些其他库的类似问题。 我打电话给链接器是: g++ -w (..lots of .o files/include directories/etc..) -L/usr/lib -lmagic LD抱怨: /usr/bin/ld: cannot将多个PDF文件合并/转换为一个PDF如何将多个PDF文件合并/转换为一个大的PDF文件? 我尝试了以下操作,但目标文件的内容与预期不符: convert file1.pdf file2.pdf merged.pdf 我需要一个非常简单/基本的命令行(cli)解决方案。最好是我可以将合并/转换的输出直接传输到pdf2ps(正如我之前在这里提出的问题中最初尝试的那样:Linux piping ( convert -> pdf2p如何在Linux中为所有用户设置java_home我是新的Linux系统,似乎有太多的Java文件夹。 Java版本给了我: Java版本“1.7.0y55” OpenJDK运行时环境(rhel-2.4.7.1.el6_5-x86_64 u55-b13) openjdk 64位服务器vm(构建24.51-b03,混合模式) 当我试图构建一个Maven项目时,我得到了一个错误: Error: JAVA_HOME is not defined c如何修复&39;sudo:不存在tty,并且没有指定askpass程序&39;错误?我正在尝试使用makefile编译一些源文件。在makefile中有一组命令需要作为sudo. 当我从一个终端编译源代码时,一切都正常,并且在第一次sudo正在运行等待密码的命令。输入密码后,恢复并完成。 但是我希望能够用netbeans编译源代码。因此,我启动了一个项目,并向netbeans展示了在哪里找到源代码,但是当我编译项目时,它给出了错误: sudo: no tty present an如何测试一个变量是否是bash中的数字?我只是不知道如何确定传递给脚本的参数是否是数字。 我只想做这样的事情: test isnumber $1 &amp;&amp; VAR=$1 || echo “need a number” 有什么帮助吗?如何确定给定的Linux是32位还是64位?当我打字时uname -a,它提供以下输出。 Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 i686 i686 i386 GNU/Linux 我怎么知道给定的操作系统是32位还是64位? 这在写作时很有用configure脚本,例如:我构建什么架构?为什么“cd”不能在shell脚本中工作?我正在尝试编写一个小脚本,将当前目录更改为我的项目目录: #!/bin/bash cd /home/tree/projects/java 我将此文件保存为proj,并添加了执行权限chmod,并将其复制到/usr/bin. 当我打电话给它时:proj它什么也不做。我做错什么了?你为什么要放!/脚本文件开头的bin/bash?我已经做了Bash以前的脚本和它们在开始时都没有运行良好。把它放进去有什么意义?事情会有什么不同吗? 另外,你怎么发音#?我知道!发音为“bang”。 如何#!明显的?如何将密码传递给SCP?我知道不建议这样做,但是否可以将用户的密码传递给SCP? 我想通过SCP复制一个文件作为批处理作业的一部分,而接收服务器当然需要密码,不,我不能轻易地将其更改为基于密钥的身份验证。如何登录mysql,从linux终端查询数据库我使用的是DebianLinux。 我有一台安装mysql的Linux机器。 我可以使用根用户和其他用户登录到我的Linux机器。 我可以使用sqlyog从Windows机器连接到Linux机器上的mysql数据库。 现在我只想使用Linux终端在Linux机器上执行查询 我在候机楼做了以下几件事 我转到根目录,然后转到/var/lib目录 我在终端上运行以下命令 mysqladmin -u ro在Linux中未定义对pthread_create的引用我从网上下载了以下演示https://computing.llnl.gov/tu… #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void PrintHello(void threadid) { long tid; tid = (long)使用openssl从服务器获取证书我正在尝试获取远程服务器的证书,然后我可以使用它来添加到我的密钥库中,并在我的Java应用程序中使用。 一位高级开发人员(节假日:()告诉我我可以运行这个: openssl s_client -connect host.host:9999 得到一个原始证书,然后我可以复制和导出。我收到以下输出: depth=1 /C=NZ/ST=Test State or Province/O=Organiza如何查看按实际内存使用情况排序的顶级进程?我有一台有12G内存的服务器。顶部的碎片如下所示: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND递归计算Linux目录中的文件数如何递归计算Linux目录中的文件? 我发现这一点: find DIR_NAME -type f ¦ wc -l 但当我运行它时,它返回以下错误。 find:路径必须在表达式之前:?unicodedecode错误:&39;utf8&39;codec可以&39;t解码字节0x9c我有一个套接字服务器,它应该从客户机接收UTF-8有效字符。 问题是有些客户机(主要是黑客)通过它发送所有错误的数据。 我可以很容易地分辨出真正的客户机,但我将记录所有发送的数据,以便稍后分析。 有时我会有这样的角色œ这导致UnicodeDecodeError错误。 我需要能够使字符串utf-8带有或不带有这些字符。 更新: 对于我的特殊情况,套接字服务是MTA,因此我只希望接收如下ASCII命如何将输出重定向到文件和stdout在巴什,打电话foo将在stdout上显示该命令的任何输出。 打电话foo > output将该命令中的任何输出重定向到指定的文件(在本例中为“output”)。 有没有方法将输出重定向到文件和它在stdout上显示了吗?[在Linux中更改默认shell[关闭]](https://bug200.com/post/13046…如何更改默认shell?这个env命令当前显示: SHELL=/bin/tcsh 我想把它改成bash。如何更改Linux中打开文件的数量限制?[关闭]在运行我的应用程序时,我有时会得到一个关于too many files open. 运行ulimit -a报告限制为1024。如何将限制提高到1024以上? 编辑 ulimit -n 2048导致权限错误。检查Ubuntu上是否正在运行特定的服务我不知道服务的名称,但希望通过检查服务的状态来停止服务。例如,如果我想检查PostgreSQL服务是否正在运行,但我不知道服务的名称,那么如何检查其状态? 如果知道服务名,我知道检查状态的命令。如何将终端连接到Ubuntu 10.10(Maverick Meerkat)上的串行到USB设备?我正在尝试将minicom连接到通过USB到串行适配器连接的串行设备。这是一个PL2303,从我所读到的所有内容来看,不需要额外的驱动程序。该设备被识别为PL2303。 我是Minicom的初学者。这是要执行的正确命令吗?或者我需要配置什么? $ sudo minicom –device /dev/ttyUSB0 minicom: cannot open /dev/ttyUSB0: No sucgrep,但仅限于某些文件扩展名我正在写一些剧本给grep某些目录,但这些目录包含各种文件类型。 我想grep只是.h和.cpp现在,但将来可能会有其他一些。 到目前为止,我有: { grep -r -i CP_Image ~/path1/; grep -r -i CP_Image ~/path2/; grep -r -i CP_Image ~/path3/; grep -r -i CP_Image /path4/;查找连接到Linux计算机的所有存储设备[关闭]我需要找到所有与给定机器相连的可写存储设备,不论是否它们是安装的。 做这件事的愚蠢方法是尝试每个条目/dev对应于可写设备(hd and sd…… 有更好的解决方案吗,还是我应该坚持这个?参数列表对于rm、cp、mv命令太长错误我在Unix的一个目录下有几百个pdf。PDF的名称非常长(大约60个字符)。 当我尝试使用以下命令一起删除所有pdf时: rm -f *.pdf 我得到以下错误: /bin/rm: cannot execute [Argument list too long] 这个错误的解决方案是什么? 发生此错误的原因是mv和cp还有命令吗?如果是,如何解决这些命令?chmod递归我有一个归档文件,它是由其他人归档的,我想在下载后自动更改提取文件中文件系统的一个分支以获得读取权限。(我无法更改存档的创建方式)。 我研究过这条线:chmod: How to recursively add execute permissions only to files which already have execute permission像其他人一样,但没有快乐。 目录最初带有多个但所如何设置wget的代理?我想下载一些wget使用代理: HTTP Proxy: 127.0.0.1 Port: 8080 代理不需要用户名和密码。 我该怎么做?我查了很多网站和很多建议,但没有什么对我有用…/configure:/bin/sh^m:错误的解释程序[重复]这个问题已经有了答案: Are shell scripts sensitive to encoding and line endings? 2答为python安装tkinter我正在尝试导入tkinter。但是,我收到一个错误,说明尚未安装tkinter: 导入错误:没有名为_tkinter的模块,请安装python tk包 我可以使用Synaptic Manager安装它(可以吗?)但是,我必须在我编程的每台机器上安装它。是否可以将tkinter库添加到我的工作区并从那里引用它?在Ubuntu[关闭]中创建目录的符号链接下面是我创建目录符号链接的代码: sudo ln -s /usr/local/nginx/conf/ /etc/nginx 我已经创建了目录/etc/nginx. 我只想要源目录的内容(/usr/local/nginx/conf/)位于目标目录的内容中(/etc/nginx)但当我执行代码时,/etc/nginx包含一个名为conf,而不是conf. 那个目录包含我想要的内容,但位置不对。 为如何在Linux上通过ftp递归下载文件夹[关闭]我正在尝试使用命令行ftp客户机对文件夹进行ftp,但到目前为止,我只能使用“get”来获取单个文件。在一行中执行合并多个Linux命令我尝试在一行中合并多个Linux命令来执行部署操作。 例如 cd /my_folder rm *.jar svn co path to repo mvn compile package install提取bash中没有路径和扩展名的文件basename[重复]这个问题已经有了答案: Extract filename and extension in Bash 36答如何在Linux中添加gcc的默认include路径?我希望GCC包括来自$HOME/include除了通常的include目录外,似乎没有类似于$LD_LIBRARY_PATH. 我知道我可以在编译时(或在makefile中)在命令行中添加include目录,但是我真的希望这里有一个通用的方法,就像在库中一样。有效测试Linux上的端口是否打开(无nmap或netcat)从bash脚本中,我如何快速发现端口445在服务器上打开/侦听。 我尝试过几种选择,但我想要一些快速的方法:1。lsof -i :445(以秒为单位)2。netstat -an |grep 445 |grep LISTEN(以秒为单位)三。telnet(它不返回)4。nmap,netcat在服务器上不可用 很高兴知道一种不先枚举然后再枚举greps的方法。如何从命令行获取Linux中的CPU/内核数量?我有这个脚本,但我不知道如何获取打印输出中的最后一个元素: cat /proc/cpuinfo | awk ‘/^processor/{print $3}’ 最后一个元素应该是CPU的数量,减去1。给定两个目录树,我如何才能找出哪些文件不同?如果我想找出两个目录树之间的区别,我通常只执行: diff -r dir1/ dir2/ 这将精确输出相应文件之间的差异。我只想得到内容不同的相应文件的列表。我认为这只是将命令行选项传递给diff但是我在主页上找不到任何东西。 有什么建议吗?更改Linux中VNC会话的分辨率[关闭]我使用VNC连接到工作中的Linux工作站。在工作中,我有一个20英寸的显示器,它以1600x1200的速度运行,而在家里,我使用的是分辨率为1440x900的笔记本电脑。 如果我将vncserver设置为1440x900,我会错过监视器上的大量空间,而如果将它设置为1600x1200,它就不适合笔记本电脑的屏幕,我必须一直滚动它。 有没有什么好方法可以动态调整VNC会话的大小? 我的VNC服务器使用Linux命令行卸载node.js?如何在Linux中使用命令行卸载node.js?如何免费使用inode?我有一个磁盘驱动器,其中inode的使用率为100%(使用df -i命令)。 但是,在大量删除文件之后,使用率仍然是100%。 那么,正确的方法是什么? 使用较少磁盘空间的磁盘驱动器如何可能 与磁盘空间使用率较高的磁盘驱动器相比,inode使用率更高? 如果压缩大量文件,是否可以减少使用的inode计数?从Linux上的epoch开始获取当前时间(秒),bash我需要一些简单的东西date,但从1970年起以秒为单位,而不是当前日期、小时、分钟和秒。 date似乎没有提供这种选择。有简单的方法吗?我在哪里可以找到Linux中的Java SDK?我使用apt-get-install安装了JDK。我不知道我的JDK文件夹在哪里。我需要为它设置路径。有人知道地点吗?move_uploaded_file gives&ldquo;failed to open stream:permission denied&rdquo;error after all configurations I do当我试图在CentOS上用Apache2.2和php 5.3配置upload目录时,总是会遇到这个错误。 在PHP.ini中: upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/ 在HTTPD.CONF: Directory /var/www/html/mysite/tmp_file_upload/> Options -I如何让cp命令创建将文件复制到目标的任何必要文件夹[重复]这个问题已经有了答案: Linux: copy and create destination dir if it does not exist 16答用脚本自动输入ssh密码我需要创建一个脚本,自动向OpenSSH输入密码ssh客户端。 假设我需要myname@somehost使用密码a1234b. 我已经试过了… #/bin/myssh.sh ssh myname@somehost a1234b …但这不起作用。 如何将此功能写入脚本?递归查找具有特定扩展名的文件我正在尝试使用我的bash(最新的UbuntuLTS版本)在目录及其子目录中查找具有特定扩展名的所有文件。 这是在脚本文件中写入的内容: #!/bin/bash directory="/home/flip/Desktop" suffix=“in” browsefolders () for i in “$1”/; do echo “dir :$directory” e[Linux/CentOS PC上的php.ini文件在哪里?[复制品]](https://bug200.com/post/17850…这个问题已经有了答案: Dude, where’s my php.ini? 12答需要一个好的Linux十六进制编辑器[关闭]我需要一个好的Linux十六进制编辑器,我的意思是: 快的 搜索/替换功能 不仅可以显示十六进制的数据,还可以显示二进制、八进制等。 可以处理大型(>1 GB)文件,而不会变得缓慢和无响应(这一要求很重要) 可选,具有一些比较/差异功能 你能提出什么建议?在bash脚本中通过管道与剪贴板连接是否可以在bash中通过管道与剪贴板进行连接? 无论是通过管道连接到设备手柄还是使用辅助应用程序,我都找不到任何东西。 例如,如果/dev/clip是一个链接到剪贴板的设备,我们可以做到: cat /dev/clip # Dump the contents of the clipboard cat foo > /dev/clip # Dump the contents of如何按名称而不是PID终止进程?例如,有时当我试图启动Firefox时,它会说一个Firefox进程已经在运行。所以我必须这样做: jeremy@jeremy-desktop:$ ps aux | grep firefox jeremy 7451 25.0 27.4 170536 65680 ? Sl 22:39 1:18 /usr/lib/firefox-3.0.1/firefox jeremy如何在Windows命令行中查找mysql数据目录在Linux中,我可以使用命令找到mysql安装目录which mysql. 但我在窗户里找不到。我试过echo %path%它产生了许多路径以及通向mysql-bin的路径。 我想在Windows的命令行中找到mysql数据目录,以便在批处理程序中使用。我还想从Linux命令行中找到mysql数据目录。有可能吗?或者我们怎么做? 在我的例子中,mysql数据目录位于安装文件夹,即..MYSQL如何测试mysql在哪个端口上运行,是否可以连接?我安装了MySQL,甚至以用户身份登录。 但当我尝试这样连接时: http://localhost:3306 mysql://localhost:3306 两者都不起作用。不确定这两个是否都可以工作,但至少其中一个应该工作:) 我怎样才能确定港口确实是3306?有没有Linux命令可以看到它? 还有,有没有更正确的方法来尝试通过一个URL?使用sed删除空行我尝试使用sed删除空行: sed ‘/^$/d’ 但我没有运气。 例如,我有以下几行: xxxxxx yyyyyy zzzzzz 我希望它是这样的: xxxxxx yyyyyy zzzzzz 这个的代码应该是什么?如何在bash脚本中将dos/windows换行(crlf)转换为unix换行(lf)?如何以编程方式(即,不使用vi)将DOS/Windows换行符转换为Unix? 这个dos2unix和unix2dos命令在某些系统上不可用。我如何用如下命令来模拟这些sed/awk/tr?“无x11显示变量”是什么意思?我试图在我的Linux机器上安装一个Java应用程序(SLAKWORKS)。 我收到以下错误,我不理解。 你能告诉我怎么处理这个问题吗?谢谢您。 这是我得到的:(我看到一些X11显示器变量需要设置,但是我应该给它什么值以及如何设置?) $ java -jar gate-5.0-beta1-build3048-installer.jar - ERROR - java.awt.HeadlessEx用另一个字符替换字符串中的某些字符我有一根绳子 AxxBCyyyDEFzzLMN 我想全部换掉x和y和z具有_所以输出是 A_BC_DEF_LMN 如何做到这一点? 我知道一系列 echo “$string” | tr ‘x’ ‘’ | tr ‘y’ ‘’ 可以,但我想一次完成,不使用管道。 编辑:以下工作 echo “$string” | tr ‘[xyz]’ ‘_‘卸载繁忙设备我有一些Samba驱动器每天都有多个用户访问。我已经有了代码来识别共享驱动器(从SQL表中),并将它们装载到一个特殊目录中,所有用户都可以在其中访问它们。 我想知道,如果我从我的SQL表中删除一个驱动器(实际上使其脱机),有什么方法可以卸载一个繁忙的设备?到目前为止,我发现任何形式的umount都不起作用。 忽略破坏数据的可能性-是否可以卸载当前正在读取的设备?Linux递归地列出一个目录中的所有文件,包括symlink目录中的文件假设我有一个目录/dir其中有3个指向其他目录的符号链接/dir/dir11,/dir/dir12和/dir/dir13. 我想列出所有文件dir包括里面的那些dir11,dir12和dir13. 为了更通用,我想列出所有文件,包括目录中的符号链接文件。find .,ls -R等在符号链接处停止,而不导航到它们以进一步列出。如何使RPM自动安装依赖项我已经建立了两个转速包 proj1-1.0-1.x86_64.rpm libtest1-1.0-1.x86_64.rpm proj1取决于文件libtest1.so存在并正确反映在RPM包中,如下所示: user@my-pc:$ rpm -qp –requires proj1-1.0-1.x86_64.rpm libtest1.so()(64bit) user@my-pc:$ rpm[如何在Linuxshell脚本中插入新行?[复制品]](https://bug200.com/post/20536…这个问题已经有了答案: Echo newline in Bash prints literal n 17答如何在Linux[关闭]上获得总体CPU SAGE(例如57%)。例如,我想知道如何使用bash获得系统CPU使用率并以百分比表示。 样品输出: 57% 如果有多个核心,最好能计算出平均百分比。增加Linux中TCP/IP连接的最大数量我正在为一台服务器编程,我的连接数量似乎受到限制,因为我的带宽没有饱和,即使我将连接数量设置为“无限制”。 如何增加或消除Ubuntu Linux设备一次可以打开的最大连接数?操作系统是否限制了这一点,还是路由器或ISP?还是别的什么?在shell中获取程序执行时间我想在Linux shell中在几个不同的条件下执行一些东西,并且能够输出每次执行的执行时间。 我知道我可以编写一个Perl或python脚本来完成这个任务,但是有没有一种方法可以在shell中完成呢?(恰巧是巴什)如何使用gdb分析程序的核心转储文件?我的程序操作如下: exe -p param1 -i param2 -o param3 它崩溃并生成了一个核心转储文件core.pid 我想分析核心转储文件 gdb ./exe -p param1 -i param2 -o param3 core.pid 但是gdb识别exe作为GDB的输入。 在这种情况下,如何分析核心转储文件?如何知道bash脚本中的脚本文件名?如何确定脚本本身中bash脚本文件的名称? 就像我的脚本在文件中一样runme.sh,那么如何才能在不进行硬编码的情况下显示“You are running runme.sh”消息?如何在Linux命令行中替换多个文件中的字符串我需要将文件夹中许多文件中的字符串替换为ssh访问服务器。我该怎么做?在Linux系统上快速创建一个大文件我怎么能迅速地在Linux上创建大文件(Red Hat Linux系统? dd会做这项工作,但从/dev/zero当您需要一个大小为数百Gbs的文件进行测试时,写入驱动器可能需要很长时间…如果你需要反复这样做,时间就会积少成多。 我不关心文件的内容,我只是希望它能快速创建。怎么能做到? 使用稀疏文件不适用于此。我需要分配磁盘空间的文件。如何列出正在运行的屏幕会话?我有一堆服务器,在上面我用screen. 程序如下: ssh服务器XXX 发射screen 在几个选项卡中开始实验 分离screen 断开与服务器的连接 当实验运行时,我可以很容易地找到它们所使用的服务器ssh转到所有服务器并列出正在运行的进程(使用top或ps) 然而,一旦实验完成,我怎么能找到在哪些服务器上打开了一个屏幕会话(以便我可以查看输出,重新启动它们等)? PS:我的实验也会把它们 ...

February 22, 2019 · 4 min · jiezi

Linux kernel内核升级和降级的方法实践

前言相信现在很多公有云包括企业内部已经开始使用Linux内核热补丁Livepatch,没人喜欢重启机器但现实是还得再等等。通常升级内核可能有多种原因,频率最高的比如修复安全漏洞,然而我们也会遇到需要降级内核的情况,比如向下兼容或者升级后产生新的严重Bug需要回退。本文主要以CentOS为例介绍内核的升级和降级方案,虽然官方一直坚持使用旧内核3.10版本,但这也是追求极致稳定的权衡结果,有高版本内核需求比如4.10以上我们可以手动升级也可以更换Ubuntu等其它操作系统,对线上生产环境始终保持一颗敬畏之心。Linux kernel内核升级和降级的方法实践更新历史2019年01月27日 - 初稿阅读原文 - https://wsgzao.github.io/post…扩展阅读kernel - https://www.kernel.org/Linux 内核简介Linux 内核是一个整体的类 Unix 计算机操作系统内核。通常我们使用的 Linux 发行版,如 Red Hat、Debian、SUSE 等,这些都称为 Linux 的分发版。一个典型的分发版,是由 Linux 内核,以及支持的许多由 GNU 项目提供的应用程序、GNU 组件,C 标准库,CLI shell,X windows 等组成的一个完整操作系统。我们应该要知道的是,Linux 的定义仅仅是 Linux 内核,所有的”Linux” 发行版实际上是以 Linux 为内核的 GNU 系统的版本。不同的 Linux 内核版本都有其生命周期,Linux 内核组织或 Linux 发行版厂商只在该日期提供错误或漏洞修复,我们可以从从内核的版本号区分辨别,比如版本 3.16.43,该数字 3.16 表示一个长期版本,43 则表示错误修订之后再发行的具体版本号,当然我这里描述的只是提供一个参考价值,更细致的版本还有可能是 3.16.43-1 这种。值得我们关注的是,任何内核版本错误修复后的再发布版本都应该是我们考虑升级使用的内核版本。Linux 内核版本Linux 内核版本分为主线、稳定和长期版本。所有内核版本都可以在内核开发官方网站 https://www.kernel.org 上获取,目前我们看到最新的稳定内核版本为 4.20.5。主线版本代表整个 Linux 内核的一个树干,新的主线版本每 2-3 个月发布一次,所有的新功能及特性都将会包含主线版本中。稳定内核则是在主线版本中,被认为是” 稳定的” 得出。稳定内核的任何错误修复都将从主线树中返回,也就是主线内核出现的任何错误 (包括之前的任何旧版本内核的错误和 BUG) 在得到修复之后才会被指定为稳定内核,所以在通常情况下,稳定内核既有内核新功能,同时 BUG 也是最少的内核版本。稳定内核的更新发布依赖于主线内核 (直到下一个主线内核可用),稳定的内核更新是根据需要发布的,通常是每 3 个月。而对于长期内核版本,通常提供几个” 长期维护” 内核版本,用于较早的内核树错误修复返回的目的。这些内核只应用重要的错误修复,通常不会有非常频繁的更新。主线、稳定和长期都是活动内核版本,由 Linus Torvalds 及 Linux 内核组织维护和释放。 而我们平时所使用的 Linux 发行版的内核都为分发内核,许多 Linux 发行版都提供自己的” 长期维护” 内核版本,这些内核可能是也可能不是基于内核开发人员维护的内核。因此分发版本的内核版本由发行版的厂商决定并有自己的维护周期,通常由分发版更新时一起发布。安装 / 升级新内核的目的许多出于对安全的考虑,如避免以前版本中发现的漏洞更充分地认识内核,了解内核的各个内核模块和功能更好的利用 / 体验新内核的的新功能和特性安装 / 升级的方法和建议对于 CentOS/RHEL 系统,尽量使用 yum 方式或 RPM 包安装 / 升级内核,需要注意的是红帽的 Red Hat Linux 服务需要订阅。使用安装新内核而不是直接升级内核,安装新内核不会覆盖旧内核,而升级会导致新内核直接替换旧内核,可能会导致系统无法启动,安装也可以让我们在升级后有回滚的选择。一般地,对于大多数 Linux 分发版,使用 yum/dnf 和分发版布官方的存储库来升级内核,这种方式只能升级到该分发版的存储库提供的最新版本,而不是 Linux 内核组织发布的最新内核。如果想迅速并且安全地使用最新内核,对于 CentOS/RHEL 系统并不支持 yum 的方式直接安装或升级。那么此时我们可以使用 ELRepo(第三方存储库) 进行内核安装升级。下载新内核的源码包进行编译安装,这种方式有助于我们更细致地学习内核底层知识,但在生产环境中不推荐编译安装。尽量使用最新的 Linux 发行版,新的 Liunx 发行版包含该发行版维护的新内核,如果有必要,那么请使用如 yum upgrade 或者 yum update 来更新你的系统。对于 Ubuntu、Debian 等发行版,使用 apt-get update 方式来更新。内核软件包介绍kernelLinux 内核软件包,包含单、多核和多处理器系统的内核,是任何 Linux 操作系统的核心,单处理器的系统仅需安装内核包。内核处理操作系统的基本功能: 内存分配、进程分配、设备输入和输出等kernel-devel包含提供足够的针对内核软件包构建模块的内核头文件和 makefile 文件kernel-headers包含指定 Linux 内核、用户空间库文件和程序之间指定接口的 C 头文件。头文件定义了构建大多数标准程序所需的结构和常量,也是重建 glibc 软件包所必需的kernel-doc包含来自内核源代码的文档文件。各种关于 Linux 内核和设备以及驱动程序的信息都记录在这些文件当中kernel-firmware包含对于某些设备及其操作的固件信息文件kernel-debug包含许多对于内核 debug 诊断和调试的启用选项,只有当我们需要尝试收集额外的内核错误信息时才应该安装它。它是以牺牲性能为代价kernel-debug-devel包含内核 debug 诊断和调试的启用选项,以牺牲性能为代价在 CentOS 上安装 / 升级内核Linux 内核升级通常有两种方式下载新版内核到服务器上,进行编译安装,之后删除老内核, 优点是:可完全控制编译项, 缺点是:慢,且容易失败;采用 yum 方式安装, 优点是:快捷方便,成功率高。我这里采用第二种方式来安装, 采用 yum 安装最多也就三五分钟的事, 万一失败还能补救。Linux OS version: CentOS Linux release 7.5.1804 (Core)Linux kernel 升级原因: CPU性能优化Linux kernel 当前版本: 3.10.0-862.el7.x86_64Linux kernel 目标版本: 3.10.0-862.14.4.el7.x86_64# 查看当前操作系统版本cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)# 查看当前内核uname -r3.10.0-862.el7.x86_64# 查看yum可升级的内核版本yum list kernel –showduplicatesInstalled Packageskernel.x86_64 3.10.0-862.el7 @anacondakernel.x86_64 3.10.0-862.11.6.el7 @updatesAvailable Packageskernel.x86_64 3.10.0-862.el7 basekernel.x86_64 3.10.0-862.2.3.el7 updateskernel.x86_64 3.10.0-862.3.2.el7 updateskernel.x86_64 3.10.0-862.3.3.el7 updateskernel.x86_64 3.10.0-862.6.3.el7 updateskernel.x86_64 3.10.0-862.9.1.el7 updateskernel.x86_64 3.10.0-862.11.6.el7 updates# 如果yum list中有需要的版本可以直接执行update升级,但现在的问题是没有yum update kernel-3.10.0-862.14.4.el7.x86_64# 可以通过Google搜索所需kernel版本,下载后离线安装升级,建议使用 -i 保留原来的内核方便版本回退ftp://ftp.riken.jp/Linux/cern/centos/7/updates/x86_64/repoview/kernel.htmlwget ftp://ftp.riken.jp/Linux/cern/centos/7/updates/x86_64/Packages/kernel-3.10.0-862.14.4.el7.x86_64.rpm# 安装完成之后重启会自动修改启动项切换至新内核rpm -ivh kernel-3.10.0-862.14.4.el7.x86_64.rpminit 6在 CentOS 上降级内核和之前Kernel升级的原因一样,降级也是因为CPU性能优化,建议各位仔细评估线上环境所需的版本Linux OS version: CentOS Linux release 7.6.1810 (Core)Linux kernel 降级原因: CPU性能优化Linux kernel 当前版本: 3.10.0-957.1.3.el7.x86_64Linux kernel 目标版本: 3.10.0-862.6.3.el7.x86_64# 查看当前操作系统版本cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core)# 查看当前内核uname -r3.10.0-957.1.3.el7.x86_64# 下载制定版本内核覆盖安装wget ftp://ftp.riken.jp/Linux/cern/centos/7/updates/x86_64/Packages/kernel-3.10.0-862.6.3.el7.x86_64.rpmrpm -ivh kernel-3.10.0-862.6.3.el7.x86_64.rpm# 禁止yum自动升级kernel(可选)vim /etc/yum.conf exclude=kernelKernel Change Log最后给大家分享下官方的Kernel Change Log,方便各位了解自己目前所用的版本是否合理The kernel package contains the Linux kernel (vmlinuz), the core of any Linux operating system. The kernel handles the basic functions of the operating system: memory allocation, process allocation, device input and output, etc.Architecture: x86_64Version: 3.10.0-957.el7[系列]2018-11-15 Jan Stancek <jstancek@redhat.com> [3.10.0-957.1.3.el7]- [x86] Mark Intel Cascade Lake supported (Steve Best) [1650213 1639980]2018-11-01 Jan Stancek <jstancek@redhat.com> [3.10.0-957.1.1.el7]- [x86] boot: Fix kexec booting failure in the SEV bit detection code (Kairui Song) [1644990 1628828] - [net] 8021q: create device with all possible features in wanted_features (Davide Caratti) [1644675 1640645] - [mm] memcontrol: fix high scheduling latency source in mem_cgroup_reparent_charges (Andrea Arcangeli) [1644673 1632898] - [kernel] cpuset: use trialcs->mems_allowed as a temp variable (Aristeu Rozanski) [1644236 1613248] - [kernel] cpuset: fix a warning when clearing configured masks in old hierarchy (Aristeu Rozanski) [1644236 1613248] - [kernel] cpuset: initialize effective masks when clone_children is enabled (Aristeu Rozanski) [1644236 1613248] - [x86] efi: Only load initrd above 4g on second try (Lenny Szubowicz) [1643359 1608955] - [x86] efi: Support initrd loaded above 4G (Lenny Szubowicz) [1643359 1608955] - [x86] efi: Generalize handle_ramdisks() and rename to handle_cmdline_files() (Lenny Szubowicz) [1643359 1608955] - [kernel] sched/fair: Fix throttle_list starvation with low CFS quota (Phil Auld) [1640675 1601153] - [target] scsi: iscsi: Use bin2hex instead of a re-implementation (Maurizio Lombardi) [1634711 1627034] {CVE-2018-14633} - [target] scsi: iscsi: Use hex2bin instead of a re-implementation (Maurizio Lombardi) [1634711 1627034] {CVE-2018-14633}2018-11-01 Jan Stancek <jstancek@redhat.com> [3.10.0-957.1.2.el7]- [net] rtnetlink: give a user socket to get_target_net() (Jiri Benc) [1639635 1630694] {CVE-2018-14646} - [net] Add variants of capable for use on on sockets (Jiri Benc) [1639635 1630694] {CVE-2018-14646}2018-10-04 Bruno E. O. Meneguele <bmeneg@redhat.com> [3.10.0-957.el7]- [mm] mlock: avoid increase mm->locked_vm on mlock() when already mlock2(, MLOCK_ONFAULT) (Rafael Aquini) [1633059]2018-10-03 Bruno E. O. Meneguele <bmeneg@redhat.com> [3.10.0-955.el7]- [netdrv] net/mlx5e: IPoIB, Set the netdevice sw mtu in ipoib enhanced flow (Alaa Hleihel) [1633652] - [netdrv] net/mlx5e: Fix traffic between VF and representor (Alaa Hleihel) [1633652] - [mm] vmscan: do not loop on too_many_isolated for ever (Waiman Long) [1632050]2018-10-03 Bruno E. O. Meneguele <bmeneg@redhat.com> [3.10.0-956.el7]- [block] blk-mq: fix hctx debugfs entry related race between update hw queues and cpu hotplug (Ming Lei) [1619988] - [nvme] nvme-pci: unquiesce dead controller queues (Ming Lei) [1632424]2018-09-24 Bruno E. O. Meneguele <bmeneg@redhat.com> [3.10.0-954.el7]- [fs] exec: Limit arg stack to at most 75 of _STK_LIM (Yauheni Kaliuta) [1625991] {CVE-2018-14634} - [fs] exec: account for argv/envp pointers (Yauheni Kaliuta) [1625991] {CVE-2018-14634} - [kernel] revert “sched/topology: Introduce NUMA identity node sched domain” (Gustavo Duarte) [1620031] - [powerpc] revert “powernv: Add a virtual irqchip for opal events” (Gustavo Duarte) [1617966] - [powerpc] revert “powernv: Reorder OPAL subsystem initialisation” (Gustavo Duarte) [1617966] - [char] revert “ipmi/powernv: Convert to irq event interface” (Gustavo Duarte) [1617966] - [tty] revert “hvc: Convert to using interrupts instead of opal events” (Gustavo Duarte) [1617966] - [powerpc] revert “powernv/eeh: Update the EEH code to use the opal irq domain” (Gustavo Duarte) [1617966] - [powerpc] revert “powernv/opal: Convert opal message events to opal irq domain” (Gustavo Duarte) [1617966] - [powerpc] revert “powernv/elog: Convert elog to opal irq domain” (Gustavo Duarte) [1617966] - [powerpc] revert “powernv/opal-dump: Convert to irq domain” (Gustavo Duarte) [1617966] - [powerpc] revert “opal: Remove events notifier” (Gustavo Duarte) [1617966] - [powerpc] revert “powernv: Increase opal-irqchip initcall priority” (Gustavo Duarte) [1617966] - [powerpc] revert “opal-irqchip: Fix double endian conversion” (Gustavo Duarte) [1617966] - [powerpc] revert “opal-irqchip: Fix deadlock introduced by"Fix double endian conversion”" (Gustavo Duarte) [1617966] - [sound] alsa: hda/realtek - two more lenovo models need fixup of MIC_LOCATION (Jaroslav Kysela) [1611958] - [sound] alsa: hda/realtek - Fix the problem of two front mics on more machines (Jaroslav Kysela) [1611958] - [sound] alsa: hda/realtek - Enable mic-mute hotkey for several Lenovo AIOs (Jaroslav Kysela) [1611958]2018-09-21 Bruno E. O. Meneguele <bmeneg@redhat.com> [3.10.0-953.el7]- [cdrom] information leak in cdrom_ioctl_media_changed() (Sanskriti Sharma) [1578207] {CVE-2018-10940} - [mm] mlock: remove lru_add_drain_all() (Oleksandr Natalenko) [1624765] - [block] blk-mq: fix race between updating nr_hw_queues and switching io sched (Ming Lei) [1619988] - [block] blk-mq: avoid to map CPU into stale hw queue (Ming Lei) [1619988] - [block] blk-mq: fix sysfs inflight counter (Ming Lei) [1548261] - [block] blk-mq: count allocated but not started requests in iostats inflight (Ming Lei) [1548261] - [block] fix a crash caused by wrong API (Ming Lei) [1548261] - [block] blk-mq: enable checking two part inflight counts at the same time (Ming Lei) [1548261] - [block] blk-mq: provide internal in-flight variant (Ming Lei) [1548261] - [block] make part_in_flight() take an array of two ints (Ming Lei) [1548261] - [block] pass in queue to inflight accounting (Ming Lei) [1548261] - [x86] Mark Intel Cascade Lake supported (Steve Best) [1584343]2018-09-18 Bruno E. O. Meneguele <bmeneg@redhat.com> [3.10.0-952.el7]- [netdrv] mlx5e: IPoIB, Use priv stats in completion rx flow (Alaa Hleihel) [1618609] - [netdrv] mlx5e: IPoIB, Add ndo stats support for IPoIB child devices (Alaa Hleihel) [1618609] - [netdrv] mlx5e: IPoIB, Add ndo stats support for IPoIB netdevices (Alaa Hleihel) [1618609] - [netdrv] mlx5e: IPoIB, Initialize max_opened_tc in mlx5i_init flow (Alaa Hleihel) [1618609] - [netdrv] mlx5e: Present SW stats when state is not opened (Alaa Hleihel) [1618609] - [netdrv] mlx5e: Avoid reset netdev stats on configuration changes (Alaa Hleihel) [1618609] - [netdrv] mlx5e: Use bool as return type for mlx5e_xdp_handle (Alaa Hleihel) [1618609] - [netdrv] net: aquantia: memory corruption on jumbo frames (Igor Russkikh) [1628238] - [kernel] revert “platform/uv: Add adjustable set memory block size function” (Baoquan He) [1625143] - [x86] revert “mm: probe memory block size for generic x86 64bit” (Baoquan He) [1625143] - [x86] revert “mm: Use 2GB memory block size on large-memory x86-64 systems” (Baoquan He) [1625143] - [x86] revert “mm: Streamline and restore probe_memory_block_size()” (Baoquan He) [1625143] - [x86] revert “mm/memory_hotplug: determine block size based on the end of boot memory” (Baoquan He) [1625143] - [mm] revert “memory_hotplug: do not fail offlining too early” (Baoquan He) [1625143] - [mm] revert “memory_hotplug: remove timeout from __offline_memory” (Baoquan He) [1625143] - [kernel] revert “x86/platform/uv: Add adjustable set memory block size function” (Baoquan He) [1625143]2018-09-17 Bruno E. O. Meneguele <bmeneg@redhat.com> [3.10.0-951.el7]- [fs] fanotify: fix logic of events on child (Miklos Szeredi) [1597738] - [fs] cifs: add a check for session expiry (Leif Sahlberg) [1626358] - [fs] xfs: completely disable per-inode DAX behavior (Eric Sandeen) [1623150] - [fs] fs: get_rock_ridge_filename(): handle malformed NM entries (Bill O’Donnell) [1340778] {CVE-2016-4913} - [md] fix ‘allow faster resync only on non-rotational media’ underneath dm (Nigel Croxon) [1561162] - [md] Revert “allow faster resync only on non-rotational media” (Nigel Croxon) [1561162] - [mm] madvise: fix madvise() infinite loop under special circumstances (Rafael Aquini) [1552982] {CVE-2017-18208} - [infiniband] srpt: Support HCAs with more than two ports (Don Dutile) [1616192] - [infiniband] overflow.h: Add allocation size calculation helpers (Don Dutile) [1616192] - [net] ip_tunnel: clean the GSO bits properly (Flavio Leitner) [1607907] - [kernel] revert cpuset: fix a warning when clearing configured masks in old hierarchy (Aristeu Rozanski) [1626943] - [s390] sclp: Change SCLP console default buffer-full behavior (Hendrik Brueckner) [1625350] - [x86] kvm: Take out __exit annotation in vmx_exit() (Waiman Long) [1626560] - [x86] mark coffeelake-s 8+2 as supported (David Arcari) [1575457] - [x86] kvm: vmx: fixes for vmentry_l1d_flush module parameter (Marcelo Tosatti) [1619602] - [x86] speculation: Use ARCH_CAPABILITIES to skip L1D flush on vmentry (Marcelo Tosatti) [1619602]Version: 3.10.0-862.el7[系列]2018-09-21 Rado Vrbovsky <rvrbovsk@redhat.com> [3.10.0-862.14.4.el7]- [scsi] Revert: lpfc: Fix port initialization failure (Radomir Vrbovsky) [1605235 1584377] - [scsi] Revert: qla2xxx: Fix NULL pointer access for fcport structure (Radomir Vrbovsky) [1597546 1547714]2018-09-13 Rado Vrbovsky <rvrbovsk@redhat.com> [3.10.0-862.14.3.el7]- [fs] exec: Limit arg stack to at most 75 of _STK_LIM (Yauheni Kaliuta) [1625980 1625991] {CVE-2018-14634} - [fs] exec: account for argv/envp pointers (Yauheni Kaliuta) [1625980 1625991] {CVE-2018-14634}2018-09-10 Jan Stancek <jstancek@redhat.com> [3.10.0-862.14.2.el7]- [uio] fix possible circular locking dependency (Xiubo Li) [1608677 1560418] - [scsi] tcmu: Don’t pass KERN_ERR to pr_err (Xiubo Li) [1608677 1560418] - [scsi] tcmu: add module wide block/reset_netlink support (Xiubo Li) [1608677 1560418] - [scsi] tcmu: simplify nl interface (Xiubo Li) [1608677 1560418] - [scsi] tcmu: track nl commands (Xiubo Li) [1608677 1560418] - [scsi] tcmu: delete unused __wait (Xiubo Li) [1608677 1560418] - [uio] fix crash after the device is unregistered (Xiubo Li) [1608677 1560418] - [uio] change to use the mutex lock instead of the spin lock (Xiubo Li) [1608677 1560418] - [uio] Prevent device destruction while fds are open (Xiubo Li) [1608677 1560418] - [uio] Reduce return paths from uio_write() (Xiubo Li) [1608677 1560418] - [uio] fix incorrect memory leak cleanup (Xiubo Li) [1608677 1560418] - [uio] add missing error codes (Xiubo Li) [1608677 1560418] - [uio] fix false positive _might_sleep warning splat (Xiubo Li) [1608677 1560418] - [uio] Destroy uio_idr on module exit (Xiubo Li) [1608677 1560418] - [uio] don’t free irq that was not requested (Xiubo Li) [1608677 1560418] - [uio] support memory sizes larger than 32 bits (Xiubo Li) [1608677 1560418] - [uio] we cannot mmap unaligned page contents (Xiubo Li) [1608677 1560418] - [uio] Pass pointers to virt_to_page(), not integers (Xiubo Li) [1608677 1560418] - [uio] fix memory leak (Xiubo Li) [1608677 1560418] - [uio] Request/free irq separate from dev lifecycle (Xiubo Li) [1608677 1560418] - [uio] Simplify uio error path by using devres functions (Xiubo Li) [1608677 1560418]2018-08-22 Rado Vrbovsky <rvrbovsk@redhat.com> [3.10.0-862.14.1.el7]- [x86] microcode: Allow late microcode loading with SMT disabled (Josh Poimboeuf) [1619622 1614515] - [infiniband] core: Fix nospec regression (Josh Poimboeuf) [1619624 1616346] - [x86] microcode/amd: Do not load when running on a hypervisor (Vitaly Kuznetsov) [1618390 1607899]2018-08-18 Rado Vrbovsky <rvrbovsk@redhat.com> [3.10.0-862.13.1.el7]- [infiniband] ib/ipoib: Fix race condition in neigh creation (Don Dutile) [1616164 1520300] - [gpu] qxl: hook monitors_config updates into crtc, not encoder (Gerd Hoffmann) [1614349 1544322] - [gpu] qxl: move qxl_send_monitors_config() (Gerd Hoffmann) [1614349 1544322] - [gpu] qxl: remove qxl_io_log() (Gerd Hoffmann) [1614349 1544322] - [kernel] locking: Introduce smp_mb__after_spinlock() (Steve Best) [1613814 1496574] - [scsi] ibmvfc: Avoid unnecessary port relogin (Steve Best) [1613202 1605080] - [powerpc] stf-barrier: update (rfi)enabled_flush_types as in upstream (Gustavo Duarte) [1612353 1585297] - [powerpc] stf-barrier: update debugfs as in upstream (Gustavo Duarte) [1612353 1585297] - [powerpc] stf-barrier: update handle_ssbd() as in upstream (Gustavo Duarte) [1612353 1585297] - [powerpc] stf-barrier: update stf_barrier_enable() as in upstream (Gustavo Duarte) [1612353 1585297] - [powerpc] stf-barrier: add cpu_show_spec_store_bypass() as in upstream (Gustavo Duarte) [1612353 1585297] - [powerpc] stf-barrier: add comment as in upstream (Gustavo Duarte) [1612353 1585297] - [powerpc] stf-barrier: move code from setup_64.c to security.c as in upstream (Gustavo Duarte) [1612353 1585297] - [powerpc] stf-barrier: move code from setup.h to security_features.h as in upstream (Gustavo Duarte) [1612353 1585297] - [powerpc] stf-barrier: update fallback routine as in upstream (Gustavo Duarte) [1612353 1585297] - [powerpc] stf-barrier: update entry barrier slot as in upstream (Gustavo Duarte) [1612353 1585297] - [nvmet-fc] move tech preview warning to nvmet_fc_register_targetport call (Ewan Milne) [1610381 1608947] - [nvme-fc] move tech preview warning to nvme_fc_register_localport call (Ewan Milne) [1610381 1608947] - [block] blk-throttle: check stats_cpu before reading it from sysfs (Ming Lei) [1608228 1567748] - [powerpc] signals: Discard transaction state from signal frames (Steve Best) [1608227 1586153] - [ipc] shm.c: add split function to shm_vm_ops (Desnes Augusto Nunes do Rosario) [1608225 1586152] - [scsi] lpfc: Fix port initialization failure (Dick Kennedy) [1605235 1584377] - [vmbus] fix the missed signaling in hv_signal_on_read() (Vitaly Kuznetsov) [1605089 1591976] - [infiniband] ib/ipoib: Fix for potential no-carrier state (Donald Dutile) [1601935 1548474] - [vmwgfx] refuse to hibernate if we have any resources. (v2) (Dave Airlie) [1601516 1595136] - [netdrv] sfc: stop the TX queue before pushing new buffers (Xin Long) [1601353 1445576] - [lib] rhashtable: Fix rhlist duplicates insertion (Xin Long) [1601009 1559106] - [kernel] hrtimer: Allow concurrent hrtimer_start() for self restarting timers (Oleksandr Natalenko) [1600911 1574387] - [iommu] amd: Add NULL sanity check for struct irq_2_irte.ir_data (Suravee Suthikulpanit) [1600661 1542697] - [hid] wacom: Correct logical maximum Y for 2nd-gen Intuos Pro large (Benjamin Tissoires) [1600660 1591499] - [md] avoid NULL dereference to queue pointer (Ming Lei) [1600056 1581845] - [scsi] qla2xxx: Fix NULL pointer access for fcport structure (Himanshu Madhani) [1597546 1547714] - [scsi] csiostor: Add a soft dep on cxgb4 driver (Arjun Vynipadath) [1597529 1584003] - [mm] initialize pages on demand during boot (Masayoshi Mizuma) [1588366 1496330] - [mm] split deferred_init_range into initializing and freeing parts (Masayoshi Mizuma) [1588366 1496330] - [kernel] cpu/hotplug: Fix ‘online’ sysfs entry with ’nosmt’ (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [kernel] cpu/hotplug: Enable ’nosmt’ as late as possible (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [net] ipv6: fix nospec-related regression in ipv6_addr_prefix() (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3693} - [net] tcp: add tcp_ooo_try_coalesce() helper (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [net] tcp: call tcp_drop() from tcp_data_queue_ofo() (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [net] tcp: detect malicious patterns in tcp_collapse_ofo_queue() (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [net] tcp: avoid collapses in tcp_prune_queue() if possible (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [net] tcp: free batches of packets in tcp_prune_ofo_queue() (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [net] add rb_to_skb() and other rb tree helpers (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [net] tcp: fix a stale ooo_last_skb after a replace (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [net] tcp: use an RB tree for ooo receive queue (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [net] tcp: refine tcp_prune_ofo_queue() to not drop all packets (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [net] tcp: increment sk_drops for dropped rx packets (Paolo Abeni) [1611368 1611369] {CVE-2018-5390} - [x86] x86/syscall: Fix regression when using the last syscall (pkey_free) (Lauro Ramos Venancio) [1589033 1589035] {CVE-2018-3693} - [kernel] cpu: hotplug: detect SMT disabled by BIOS (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [documentation] l1tf: Fix typos (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: Remove extra newline in vmentry_l1d_flush sysfs file (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: vmx: Initialize the vmx_l1d_flush_pages’ content (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] speculation: l1tf: Unbreak !__HAVE_ARCH_PFN_MODIFY_ALLOWED architectures (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [documentation] Add section about CPU vulnerabilities (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] bugs, kvm: introduce boot-time control of L1TF mitigations (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [kernel] cpu: hotplug: Set CPU_SMT_NOT_SUPPORTED early (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [kernel] cpu: hotplug: Expose SMT control init function (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: Allow runtime control of L1D flush (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: Serialize L1D flush parameter setter (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: Add static key for flush always (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: Move l1tf setup function (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: Handle EPT disabled state proper (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: Drop L1TF MSR list approach (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] litf: Introduce vmx status variable (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] bugs: Make cpu_show_common() static (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] bugs: Concentrate bug reporting into a separate function (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [kernel] cpu: hotplug: Online siblings when SMT control is turned on (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: vmx: Use MSR save list for IA32_FLUSH_CMD if required (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: vmx: Extend add_atomic_switch_msr() to allow VMENTER only MSRs (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: vmx: Separate the VMX AUTOLOAD guest/host number accounting (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: vmx: Add find_msr() helper function (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: vmx: Split the VMX MSR LOAD structures to have an host/guest numbers (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: mitigation for L1 cache terminal fault vulnerabilities, part 3 (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: Warn user if KVM is loaded SMT and L1TF CPU bug being present (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [kernel] cpu: hotplug: Boot HT siblings at least once, part 2 (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] speculation/l1tf: fix typo in l1tf mitigation string (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: protect _PAGE_FILE PTEs against speculation (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: mitigation for L1 cache terminal fault vulnerabilities, part 2 (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [kernel] cpu/hotplug: Boot HT siblings at least once (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - Revert “x86/apic: Ignore secondary threads if nosmt=force” (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] speculation/l1tf: Fix up pte->pfn conversion for PAE (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] speculation/l1tf: Protect PAE swap entries against L1TF (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] CPU/AMD: Move TOPOEXT reenablement before reading smp_num_siblings (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] speculation/l1tf: Extend 64bit swap file size limit (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] cpu/AMD: Remove the pointless detect_ht() call (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] bugs: Move the l1tf function and define pr_fmt properly (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [kernel] cpu/hotplug: Provide knobs to control SMT, part 2 (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] topology: Provide topology_smt_supported() (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] smp: Provide topology_is_primary_thread(), part 2 (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] apic: Ignore secondary threads if nosmt=force (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] cpu/AMD: Evaluate smp_num_siblings early (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] CPU/AMD: Do not check CPUID max ext level before parsing SMP info (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] cpu/intel: Evaluate smp_num_siblings early (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] cpu/topology: Provide detect_extended_topology_early() (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] cpu/common: Provide detect_ht_early() (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] cpu: Remove the pointless CPU printout (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [kernel] cpu/hotplug: Provide knobs to control SMT (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [kernel] cpu/hotplug: Split do_cpu_down() (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] smp: Provide topology_is_primary_thread() (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] CPU: Modify detect_extended_topology() to return result (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: fix build for CONFIG_NUMA_BALANCING=n (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: sync with latest L1TF patches (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: protect _PAGE_NUMA PTEs and PMDs against speculation (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [mm] l1tf: Disallow non privileged high MMIO PROT_NONE mappings (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: Report if too much memory for L1TF workaround (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: Limit swap file size to MAX_PA/2 (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: Add sysfs reporting for l1tf (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: Make sure the first page is always reserved (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: Protect PROT_NONE PTEs against speculation (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: Protect swap entries against L1TF (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] l1tf: Increase 32bit PAE __PHYSICAL_PAGE_MASK (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] mm: Fix swap entry comment and macro (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] spec_ctrl: sync with upstream cpu_set_bug_bits() (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] add support for L1D flush MSR (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620} - [x86] kvm: mitigation for L1 cache terminal fault vulnerabilities (Josh Poimboeuf) [1593383 1593384] {CVE-2018-3620}2018-08-01 Jan Stancek <jstancek@redhat.com> [3.10.0-862.12.1.el7]- [fs] CIFS: Fix NULL pointer deref on SMB2_tcon() failure (Leif Sahlberg) [1609159 1591092] - [net] multicast: do not restore deleted record source filter mode to new one (Hangbin Liu) [1610380 1586321] - [net] multicast: remove useless parameter for group add (Hangbin Liu) [1610380 1586321] - [net] ipv6/mcast: init as INCLUDE when join SSM INCLUDE group (Hangbin Liu) [1610380 1586321] - [net] ipv4/igmp: init group mode as INCLUDE when join source group (Hangbin Liu) [1610380 1586321] - [net] ipv6: mcast: fix unsolicited report interval after receiving querys (Hangbin Liu) [1610380 1586321] - [net] ipv6: refactor ipv6_dev_mc_inc() (Hangbin Liu) [1610380 1586321]2018-07-20 Rado Vrbovsky <rvrbovsk@redhat.com> [3.10.0-862.11.1.el7]- [tcmu] allow userspace to reset ring (Xiubo Li) [1599669 1562587] - [tcmu] remove commands_lock (Xiubo Li) [1599669 1562587] - [tcmu] move expired command completion to unmap thread (Xiubo Li) [1599669 1562587] - [tcmu] add cmd timeout handling wq (Xiubo Li) [1599669 1562587] - [tcmu] don’t block submitting context for block waits (Xiubo Li) [1599669 1562587] - [tcmu] fix double se_cmd completion (Xiubo Li) [1599669 1562587] - [tcmu] replace spin lock with mutex (Xiubo Li) [1599669 1562587] - [target] add SAM_STAT_BUSY sense reason (Xiubo Li) [1599669 1562587] - [target] core: add device action configfs files (Xiubo Li) [1599669 1562587] - [target] Avoid mappedlun symlink creation during lun shutdown (Xiubo Li) [1599656 1585081] - [spectre] update Spectre v1 mitigation string (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [spectre] fix hiddev nospec issues (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] syscall: clarify clobbered registers in entry code (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [powerpc] add missing barrier_nospec() in _get_user64_nocheck() (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [spectre] fix gadgets found by smatch scanner (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [alsa] rme9652: Hardening for potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [alsa] hdspm: Hardening for potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [alsa] asihpi: Hardening for potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [alsa] opl3: Hardening for potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [alsa] hda: Hardening for potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [alsa] seq: oss: Hardening for potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [alsa] seq: oss: Fix unbalanced use lock for synth MIDI device (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [net] atm: Fix potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [kernel] time: Protect posix clock array access against speculation (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [kernel] sys.c: fix potential Spectre v1 issue (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [sched] autogroup: Fix possible Spectre-v1 indexing for sched_prio_to_weight[] (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [perf] core: Fix possible Spectre-v1 indexing for ->aux_pages[] (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [sysvipc] sem: mitigate semnum index against spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [alsa] control: Hardening for potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [usbip] vhci_sysfs: fix potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [media] dvb_ca_en50221: prevent using slot_info for Spectre attacs (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [media] dvb_ca_en50221: sanity check slot number from userspace (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [atm] zatm: Fix potential Spectre v1 (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] kvm: Update spectre-v1 mitigation (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] kvm: Add memory barrier on vmcs field lookup (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] perf/msr: Fix possible Spectre-v1 indexing in the MSR driver (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] perf: Fix possible Spectre-v1 indexing for x86_pmu::event_map() (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] perf: Fix possible Spectre-v1 indexing for hw_perf_event cache (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [net] nl80211: Sanitize array index in parse_txq_params (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [include] vfs, fdtable: Prevent bounds-check bypass via speculative execution (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] syscall: Sanitize syscall table de-references under speculation (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [powerpc] Use barrier_nospec in copy_from_user() (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [include] nospec: Introduce barrier_nospec for other arches (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] Introduce barrier_nospec (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] spectre_v1: Disable compiler optimizations over array_index_mask_nospec() (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] Implement array_index_mask_nospec (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [documentation] Document array_index_nospec (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [include] nospec: Include dependency (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [include] nospec: Allow index argument to have const-qualified type (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [include] nospec: Kill array_index_nospec_mask_check() (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [include] nospec: Move array_index_nospec() parameter checking into separate macro (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [include] array_index_nospec: Sanitize speculative array de-references (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] get_user: Use pointer masking to limit speculation (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] uaccess: Use __uaccess_begin_nospec() and uaccess_try_nospec (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] Introduce __uaccess_begin_nospec() and uaccess_try_nospec (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] usercopy: Replace open coded stac/clac with _uaccess{begin, end} (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] reorganize SMAP handling in user space accesses (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] uaccess: Tell the compiler that uaccess is unlikely to fault (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690} - [x86] uaccess: fix sparse errors (Josh Poimboeuf) [1589033 1589035] {CVE-2018-3690}2018-07-04 Rado Vrbovsky <rvrbovsk@redhat.com> [3.10.0-862.10.1.el7]- [x86] add _TIF_UPROBE to _TIF_DO_NOTIFY_MASK (Oleg Nesterov) [1595155 1579521] - [x86] spec_ctrl: Always clear SPEC_CTRL MSRs when disabling IBRS (Radomir Vrbovsky) [1586150 1574730] - [sound] alsa: hda/realtek - Add headset mode support for Dell laptop (Jaroslav Kysela) [1588946 1528587] - [sound] alsa: hda/realtek - Support headset mode for ALC215/ALC285/ALC289 (Jaroslav Kysela) [1593586 1535427] - [mm] compaction: release zone irqlock in isolate_freepages_block (Andrea Arcangeli) [1596283 1582793] - [mm] compaction: change the timing to check to drop the spinlock (Andrea Arcangeli) [1596283 1582793] - [fs] dcache.c: add cond_resched() in shrink_dentry_list() (Aaron Tomlin) [1596184 1584693] - [misc] vmware balloon: Treat init like reset (Cathy Avery) [1595601 1540110] - [netdrv] qede: Fix ref-cnt usage count (Chad Dupuis) [1594700 1574847] - [x86] kvm: fix LAPIC timer drift when guest uses periodic mode (“Dr. David Alan Gilbert”) [1594292 1584775] - [x86] kvm: remove APIC Timer periodic/oneshot spikes (“Dr. David Alan Gilbert”) [1594292 1584775] - [netdrv] mlx4_en: Increase number of default RX rings (Erez Alfasi) [1594127 1520295] - [netdrv] mlx4_en: Limit the number of RX rings (Erez Alfasi) [1594127 1520295] - [netdrv] mlx4_en: Limit the number of TX rings (Erez Alfasi) [1594127 1520295] - [fs] ceph: don’t set read_ahead_kb to 0 by default (Ilya Dryomov) [1590825 1579539] - [scsi] qla2xxx: Remove stale debug value for login_retry flag (Himanshu Madhani) [1588937 1578880] - [x86] topology: Update the ‘cpu cores’ field in /proc/cpuinfo correctly across CPU hotplug operations (Prarit Bhargava) [1588563 1582023] - [acpi] osi: Add OEM _OSI strings to disable NVidia RTD3 (Jaroslav Kysela) [1584685 1581391] - [hv] vmbus: Fix a rescind issue (Eduardo Otubo) [1582124 1518498] - [linux] libata: enable host-wide tags (Ewan Milne) [1581728 1491014] - [ata] libata: remove ATA_FLAG_LOWTAG (Ewan Milne) [1581728 1491014] - [ata] Add a new flag to destinguish sas controller (Ewan Milne) [1581728 1491014] - [ata] libata: make sata_sil24 use fifo tag allocator (Ewan Milne) [1581728 1491014] - [ata] libata: move sas ata tag allocation to libata-scsi.c (Ewan Milne) [1581728 1491014] - [ata] libata: use blk taging (Ewan Milne) [1581728 1491014] - [nvme] rdma: Use mr pool (David Milburn) [1581347 1547273] - [nvme] rdma: Check remotely invalidated rkey matches our expected rkey (David Milburn) [1581347 1547273] - [nvme] rdma: wait for local invalidation before completing a request (David Milburn) [1581347 1547273] - [nvme] rdma: don’t complete requests before a send work request has completed (David Milburn) [1581347 1547273] - [nvme] rdma: don’t suppress send completions (David Milburn) [1581347 1547273] - [x86] kvm: Fix loss of pending INIT due to race (Radim Krcmar) [1580467 1569473] - [mm] mempolicy: fix use after free when calling get_mempolicy (Augusto Caringi) [1576759 1576755] {CVE-2018-10675} - [sound] alsa: seq: Fix racy pool initializations (Jaroslav Kysela) [1550171 1593586 1550169 1535427] {CVE-2018-7566} - [crypto] algif_skcipher: Load TX SG list after waiting (Bruno Eduardo de Oliveira Meneguele) [1541870 1541875] {CVE-2017-13215}2018-06-27 Frantisek Hrbata <fhrbata@hrbata.com> [3.10.0-862.9.1.el7]- [iscsi-target] Fix iscsi_np reset hung task during parallel delete (Maurizio Lombardi) [1583593 1579217]2018-06-15 Rado Vrbovsky <rvrbovsk@redhat.com> [3.10.0-862.8.1.el7]- [x86] always enable eager FPU by default on non-AMD processors (Paolo Bonzini) [1589051 1589048] {CVE-2018-3665} - [net] nf_reset: also clear nfctinfo bits (Florian Westphal) [1588458 1572983] - [x86] bugs: Switch the selection of mitigation from CPU vendor to CPU features (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] bugs: Add AMD’s SPEC_CTRL MSR usage (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] bugs: Add AMD’s variant of SSB_NO (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Fix VM guest SSBD problems (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Eliminate TIF_SSBD checks in IBRS on/off functions (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Disable SSBD update from scheduler if not user settable (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Make ssbd_enabled writtable (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Remove thread_info check in _wrmsr_on_cpu() (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Write per-thread SSBD state to spec_ctrl_pcp (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Add a read-only ssbd_enabled debugfs file (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] bugs/intel: Set proper CPU features and setup RDS (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] kvm: vmx: Emulate MSR_IA32_ARCH_CAPABILITIES (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] kvm: svm: Implement VIRT_SPEC_CTRL support for SSBD (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] speculation, KVM: Implement support for VIRT_SPEC_CTRL/LS_CFG (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] bugs: Rework spec_ctrl base and mask logic (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Rework SPEC_CTRL update after late microcode loading (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Make sync_all_cpus_ibrs() write spec_ctrl_pcp value (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] bugs: Unify x86_spec_ctrl{set_guest, restore_host} (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] speculation: Rework speculative_store_bypass_update() (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] speculation: Add virtualized speculative store bypass disable support (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] bugs, KVM: Extend speculation control for VIRT_SPEC_CTRL (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] KVM: Rename KVM SPEC_CTRL MSR functions to match upstream (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] speculation: Handle HT correctly on AMD (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] cpufeatures: Add FEATURE_ZEN (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] cpufeatures: Disentangle SSBD enumeration (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] cpufeatures: Disentangle MSR_SPEC_CTRL enumeration from IBRS (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] speculation: Use synthetic bits for IBRS/IBPB/STIBP (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [documentation] spec_ctrl: Do some minor cleanups (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] speculation: Make “seccomp” the default mode for Speculative Store Bypass (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] seccomp: Move speculation migitation control to arch code (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [kernel] seccomp: Add filter flag to opt-out of SSB mitigation (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [kernel] seccomp: Use PR_SPEC_FORCE_DISABLE (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] prctl: Add force disable speculation (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spectre_v2: No mitigation if CPU not affected and no command override (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] pti: Do not enable PTI on CPUs which are not vulnerable to Meltdown (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] bug: Add X86_BUG_CPU_MELTDOWN and X86_BUG_SPECTRE_V[12] (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] pti: Rename CONFIG_KAISER to CONFIG_PAGE_TABLE_ISOLATION (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Sync up naming of SPEC_CTRL MSR bits with upstream (Waiman Long) [1584323 1584569] {CVE-2018-3639} - [x86] spec_ctrl: Sync up SSBD changes with upstream (Waiman Long) [1584323 1584569] {CVE-2018-3639} ...

January 28, 2019 · 25 min · jiezi

阿里如何做到百万量级硬件故障自愈?

随着阿里大数据产品业务的增长,服务器数量不断增多,IT运维压力也成比例增大。各种软、硬件故障而造成的业务中断,成为稳定性影响的重要因素之一。本文详细解读阿里如何实现硬件故障预测、服务器自动下线、服务自愈以及集群的自平衡重建,真正在影响业务之前实现硬件故障自动闭环策略,对于常见的硬件故障无需人工干预即可自动闭环解决。1.背景1.1.面临挑战对于承载阿里巴巴集团95%数据存储及计算的离线计算平台MaxCompute,随着业务增长,服务器规模已达到数十万台,而离线作业的特性导致硬件故障不容易在软件层面被发现,同时集团统一的硬件报障阈值常常会遗漏一些对应用有影响的硬件故障,对于每一起漏报,都对集群的稳定性构成极大的挑战。针对挑战,我们面对两个问题:硬件故障的及时发现与故障机的业务迁移。下面我们会围绕这两个问题进行分析,并详细介绍落地的自动化硬件自愈平台——DAM。在介绍之前我们先了解下飞天操作系统的应用管理体系——天基(Tianji)。1.2.天基应用管理MaxCompute是构建在阿里数据中心操作系统——飞天(Apsara)之上,飞天的所有应用均由天基管理。天基是一套自动化数据中心管理系统,管理数据中心中的硬件生命周期与各类静态资源(程序、配置、操作系统镜像、数据等)。而我们的硬件自愈体系正是与天基紧密结合,利用天基的Healing机制构建面向复杂业务的硬件故障发现、自愈维修闭环体系。透过天基,我们可以将各种物理机的指令(重启、重装、维修)下发,天基会将其翻译给这台物理机上每个应用,由应用根据自身业务特性及自愈场景决策如何响应指令。2.硬件故障发现2.1.如何发现我们所关注的硬件问题主要包含:硬盘、内存、CPU、网卡电源等,下面列举对于常见硬件问题发现的一些手段和主要工具:在所有硬件故障中,硬盘故障占比50%以上,下面分析一下最常见的一类故障:硬盘媒介故障。通常这个问题表象就是文件读写失败/卡住/慢。但读写问题却不一定是媒介故障产生,所以我们有必要说明一下媒介故障的在各层的表象。a. 系统日志报错是指在/var/log/messages中能够找到类似下面这样的报错Sep 3 13:43:22 host1.a1 kernel: : [14809594.557970] sd 6:0:11:0: [sdl] Sense Key : Medium Error [current]Sep 3 20:39:56 host1.a1 kernel: : [61959097.553029] Buffer I/O error on device sdi1, logical block 796203507b. tsar io指标变化是指rs/ws/await/svctm/util等这些指标的变化或突变,由于报错期间会引起读写的停顿,所以通常会体现在iostat上,继而被采集到tsar中。在tsar io指标中,存在这样一条规则让我们区分硬盘工作是否正常 qps=ws+rs<100 & util>90,假如没有大规模的kernel问题,这种情况一般都是硬盘故障引起的。c. 系统指标变化通常也由于io变化引起,比如D住引起load升高等。d. smart值跳变具体是指197(Current_Pending_Sector)/5(Reallocated_Sector_Ct)的跳变。这两个值和读写异常的关系是:媒介读写异常后,在smart上能观察到197(pending) +1,表明有一个扇区待确认。随后在硬盘空闲的时候,他会对这个197(pending)中攒的各种待确认扇区做确认,如果读写通过了,则197(pending) -1,如果读写不通过则 197(pending)-1 且 5(reallocate)+1。总结下来,在整条报错链路中,只观察一个阶段是不够的,需要多个阶段综合分析来证明硬件问题。由于我们可以严格证明媒介故障,我们也可以反向推导,当存在未知问题的时候能迅速地区分出是软件还是硬件问题。上述的工具是结合运维经验和故障场景沉淀出来,同时我们也深知单纯的一个发现源是远远不够的,因此我们也引入了其他的硬件故障发现源,将多种检查手段结合到一起来最终确诊硬件故障。2.2.如何收敛上一章节提到的很多工具和路径用来发现硬件故障,但并不是每次发现都一定报故障,我们进行硬件问题收敛的时候,保持了下面几个原则:指标尽可能与应用/业务无关:有些应用指标和硬件故障相关性大,但只上监控,不作为硬件问题的发现来源。 举一个例子,当io util大于90%的时候硬盘特别繁忙,但不代表硬盘就存在问题,可能只是存在读写热点。我们只认为io util>90且iops<30 超过10分钟的硬盘可能存在硬件问题。采集敏感,收敛谨慎:对于可能的硬件故障特征都进行采集,但最终自动收敛分析的时候,大多数采集项只做参考,不作为报修依据。 还是上一个硬盘io util的例子,如果单纯出现io util>90且iops<30的情况,我们不会自动报修硬盘,因为kernel问题也可能会出现这个情况。只有当 smartctl超时/故障扇区 等明确故障项出现后,两者关联才确诊硬盘故障,否则只是隔离观察,不报修。2.3.覆盖率以某生产集群,在20xx年x月的IDC工单为例,硬件故障及工单统计如下:去除带外故障的问题,我们的硬件故障发现占比为97.6%。3.硬件故障自愈3.1 自愈流程针对每台机器的硬件问题,我们会开一个自动轮转工单来跟进,当前存在两套自愈流程:【带应用维修流程】和【无应用维修流程】,前者针对的是可热拔插的硬盘故障,后者是针对余下所有的整机维修硬件故障。在我们的自动化流程中,有几个比较巧妙的设计:a. 无盘诊断对于宕机的机器而言,无法进无盘(ramos)才开【无故宕机】维修工单,这样能够大量地减少误报,减少服务台同学负担。无盘中的压测可以完全消除当前版本的kernel或软件的影响,真实地判断出硬件是否存在性能问题。b. 影响面判断/影响升级对于带应用的维修,我们也会进行进程是否D住的判断。如果存在进程D住时间超过10分钟,我们认为这个硬盘故障的影响面已扩大到了整机,需要进行重启消除影响。在重启的时候如果出现了无法启动的情况,也无需进行人工干预,直接进行影响升级,【带应用维修流程】直接升级成【无应用维修流程】。c. 未知问题自动化兜底在运行过程中,会出现一些机器宕机后可以进无盘,但压测也无法发现任何硬件问题,这个时候就只能让机器再进行一次装机,有小部分的机器确实在装机过程中,发现了硬件问题继而被修复了。d. 宕机分析整个流程巧妙的设计,使得我们在处理硬件故障的时候,同时具备了宕机分析的能力。不过整机流程还以解决问题为主导向,宕机分析只是副产品。同时,我们也自动引入了集团的宕机诊断结果进行分析,达到了1+1>2的效果。3.2.流程统计分析如果是同样的硬件问题反复触发自愈,那么在流程工单的统计,能够发现问题。例如联想RD640的虚拟串口问题,在还未定位出根因前,我们就通过统计发现了:同个机型的机器存在反复宕机自愈的情况,即使机器重装之后,问题也还是会出现。接下来我们就隔离了这批机器,保障集群稳定的同时,为调查争取时间。3.3.业务关联误区事实上,有了上面这套完整的自愈体系之后,某些业务上/kernel上/软件上需要处理的问题,也可以进入这个自愈体系,然后走未知问题这个分支。其实硬件自愈解决业务问题,有点饮鸩止渴,容易使越来越多还没想清楚的问题,尝试通过这种方式来解决兜底。当前我们逐步地移除对于非硬件问题的处理,回归面向硬件自愈的场景(面向软件的通用自愈也有系统在承载,这类场景与业务的耦合性较大,无法面向集团通用化),这样也更利于软硬件问题分类和未知问题发现。4.架构演进4.1.云化最初版本的自愈架构是在每个集群的控制机上实现,因为一开始时候运维同学也是在控制机上处理各种问题。但随着自动化地不断深入,发现这样的架构严重阻碍了数据的开放。于是我们采用中心化架构进行了一次重构,但中心化架构又会遇到海量数据的处理问题,单纯几个服务端根本处理不过来。因此我们对系统进一步进行分布式服务化的重构,以支撑海量业务场景,将架构中的各个模块进行拆解,引入了 阿里云日志服务(sls)/阿里云流计算(blink)/阿里云分析数据库(ads) 三大神器,将各个采集分析任务由云产品分担,服务端只留最核心的硬件故障分析和决策功能。下面是DAM1与DAM3的架构对比4.2.数据化随着自愈体系的不断深入,各阶段的数据也有了稳定的产出,针对这些数据的更高维分析,能让我们发现更多有价值且明确的信息。同时,我们也将高维的分析结果进行降维,采用健康分给每台机器打标。通过健康分,运维的同学可以快速知晓单台机器、某个机柜、某个集群的硬件情况。4.3.服务化基于对全链路数据的掌控,我们将整个故障自愈体系,作为一个硬件全生命周期标准化服务,提供给不同的产品线。基于对决策的充分抽象,自愈体系提供各类感知阈值,支持不同产品线的定制,形成适合个性化的全生命周期服务。5.故障自愈闭环体系在AIOps的感知、决策、执行闭环体系中,软件/硬件的故障自愈是最常见的应用场景,行业中大家也都选择故障自愈作为首个AIOps落地点。在我们看来,提供一套通用的故障自愈闭环体系是实现AIOps、乃至NoOps(无人值守运维)的基石,应对海量系统运维,智能自愈闭环体系尤为重要。5.1.必要性在一个复杂的分布式系统中,各种架构间不可避免地会出现运行上的冲突,而这些冲突的本质就在于信息不对称。而信息不对称的原因是,每种分布式软件架构在设计都是内敛闭环的。现在,通过各种机制各种运维工具,可以抹平这些冲突,然而这种方式就像是在打补丁,伴随着架构的不断升级,补丁似乎一直都打不完,而且越打越多。因此,我们有必要将这个行为抽象成自愈这样一个行为,在架构层面显式地声明这个行为,让各软件参与到自愈的整个流程中,将原本的冲突通过这种方式转化为协同。当前我们围绕运维场景中最大的冲突点:硬件与软件冲突,进行架构和产品设计,通过自愈的方式提升复杂的分布式系统的整体鲁棒性。5.2.普适性透过大量机器的硬件自愈轮转,我们发现:被纳入自愈体系的运维工具的副作用逐渐降低(由于大量地使用运维工具,运维工具中的操作逐渐趋于精细化)。被纳入自愈体系的人工运维行为也逐渐变成了自动化。每种运维动作都有了稳定的SLA承诺时间,不再是随时可能运行报错的运维脚本。因此,自愈实际上是在复杂的分布式系统上,将运维自动化进行充分抽象后,再构筑一层闭环的架构,使得架构生态形成更大的协调统一。本文作者:钟炯恩阅读原文本文来自云栖社区合作伙伴“阿里技术”,如需转载请联系原作者。

November 20, 2018 · 1 min · jiezi