自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 bcc和ftrace追踪内核网络模块实战

bcc是ebpf技术的一个前端,集成了ebpf/kprobe/uprobe的很多东西,对一些常见功能做了整合。而ebpf是近几年出现的比较热门的一项技术,它的前身是bpf(Berkeley Packet Filter),也就是我们tcpdump使用的过滤数据包的技术。ebpf对bpf进行了扩展,它能在内核中运行自定义程序, 而无需修改内核源码或者加载内核模块。ftrace有两种概念,一种是广义的ftrace框架,一种是狭义的追踪技术。

2022-09-02 16:45:27 676

原创 【kernel】【patch学习】一个字段使文件系统性能提升224%

一个字段,如何使文件系统性能提升224%

2022-07-23 19:13:57 476

原创 qemu+gdb调试内核环境搭建,亲自踩坑记录

前言想搭建个qemu+gdb的环境,看网上的文档都非常简单,结果自己弄了13个小时才给调好,赶紧记录下来以免以后再踩相同的坑

2021-12-18 21:22:48 1294

翻译 【kernel doc】The Second Extended Filesystem(ext2)

文章目录The Second Extended FilesystemOptions原文链接:The Second Extended FilesystemThe Second Extended Filesystemext2 最初于 1993 年 1 月发布。由R’emy Card, Theodore Ts’o和Stephen Tweedie编写,这是对Extended Filesystem的重大改写。它目前仍然(2001 年 4 月)是 Linux 使用的主要文件系统。也有适用于 NetBSD、Fre

2021-12-09 09:36:47 228

翻译 非对齐内存访问

=========================非对齐内存访问:作者: Daniel Drake [email protected],:作者: Johannes Berg [email protected]:以及和来自他们的帮助: Alan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt,Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz,Vad

2021-11-12 11:01:44 2912

原创 【linux kernel 3.10】查看文件内容是否全部被page cache所缓存

前言bpf提供了一种方法,可以使用户在内核函数运行的某个阶段(如运行前和运行后)插入一段用户指定的程序并运行。这篇文章实现了一个bpf小程序,可以查看某个文件是否全部被缓存到page cache中,并打印出文件被缓存了多少页和文件一共有多少页1. 安装bcc以centos发行版为例,直接yum install bcc -y即可其他系统请参见INSTALL2. bpf程序源码#!/usr/bin/env python3#coding=utf-8from __future__ import p

2021-10-06 15:06:08 430

翻译 【linux3.10】【nfs】使文件系统可导出

原文链接:Exporting概述  所有的文件系统操作都需要一个dentry(或者两个)作为起始点。本地应用程序通过打开的文件描述符或 cwd/root 对合适的 dentry 进行引用计数保留。然而,通过远程文件系统协议(如 NFS)访问文件系统的远程应用程序可能无法保存这样的引用,因此需要一种不同的方式来引用特定的 dentry。由于替代的引用形式需要在重命名、截断和服务器重启时保持稳定(除其他外,尽管这些往往是最有问题的),因此没有像“文件名”这样的简单答案。  此处讨论的机制允许每个文件系统

2021-09-05 17:50:00 350

原创 【linux3.10】从内存反向映射(reverse mapping)的角度来看vma的组织和使用

前言准备名词解释虚拟内存vma  假如你来设计linux内核,你会如何管理有限的内存呢?最直观最简单的一种方法是,只要有人(进程)申请内存资源,你就直接给它。但这样有个问题,如果某些人(进程)申请了很多内存但却不使用,那这些内存岂不是被白白浪费掉了?于是你想了个办法,有人申请内存时,先拿小本本记录下来某人(进程)申请了多大内存,但先不给他使用,防止他拿了内存却不干事,等到他真的要用的时候,再根据本本上的记录来给他实际分配内存。这样,虚拟内存的概念就有了,你在小本本上的每一条记录,都是一块虚拟内存。

2021-07-29 23:30:03 742

原创 【linux3.10】内存反向映射中的anon_vma是per process的吗?

前言在学习虚拟内存的反向映射部分时,遇到了struct anon_vma这个结构,在网上看了很多篇帖子,都说是per process的,但是自己阅读代码过程发现逻辑似乎并不是这样,一时就很奇怪,是帖子描述的有问题,还是我没有理解透彻?实践出真知,与其在代码上纠结半天,不如根据看代码运行结果,让我们进入内核这个黑箱子,来看看它究竟如何运作工具准备我使用的是bcc这个工具,使用起来非常简单,在centos下只要yum install bcc-tools -y,再加上可以使用python,就可以使用bcc这

2021-07-20 02:28:22 432 1

原创 【linux3.10】一些学习资源整理

此文仅为记录一些学习过程中很有帮助的帖子,以留作记录和大家参考内存管理虚拟内存反向映射Linux内存逆向映射(reverse mapping)技术的前世今生内存回收(匿名页反向映射)linux内存管理-反向映射linux-weekly-news:Memory_management-Object-based_reverse_mapping...

2021-07-15 22:02:25 116

翻译 【kernel doc】Object-based Reverse Mapping(基于对象的反向映射)

原文链接:Object-based Reverse Mapping注:以下翻译不区分page,struct page,页面,物理页等名词,都是代表物理内存页面。摘要长期以来,人们一直在寻求可以改进vm的页换出算法,该算法可以把用户地址从物理转换为虚拟地址(反向映射)。2.6中加入了一个实现,每个Page使用一个反向指针指向它的映射(pte链表)。虽然 pte 链表确实有效,但它们会在mapping/unmapping和fork/exit期间增加大量空间开销和大量时间开销。我将描述一种反向映射的替代

2021-07-12 20:22:49 149

原创 【linux3.10】从mmap的实现来看vma的组织和使用

准备概念明晰mmap是linux提供的一种共享内存的方案,用户可以把文件映射进内核,内核返回一个地址,用户对这个地址进行操作,就等于直接对文件进行读写,优点是省去了常规读写文件的把用户态数据拷贝进内核的开销,并且多个进程可以映射同一个文件,也是一种多进程通信的方案。关于共享内存,可以参阅宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)vma,全称virtual_memory_area,直译过来就是虚拟内存区域。我们知道,linux是用虚拟内存管理进程的,进程申请内存时内核并不会直接分配物

2021-07-10 16:49:14 916

翻译 【kernel doc】rbtree

文章原文:rbtree.txt什么是红黑树,它们有什么作用?红黑树是一种自平衡的二叉搜索树,用来存储可排序的数据键值对。这不同于基树(radix tree)(用于有效存储稀疏数组,使用长整数索引来插入/访问/删除节点)和哈希表(不能保持有序—用来方便地按序遍历,并且必须针对特定大小和哈希函数进行调整,而rbtrees 可以优雅地存储任意键)。红黑树类似于 AVL 树,但在最坏场景下为插入和删除提供更快的实时有界性能,最多分别旋转两次和三次,来平衡树),速度稍慢(但仍然是 O(log n)) 查找时间

2021-07-07 21:21:31 161

翻译 【kernel doc】【vm】numa_memory_policy

linux内存策略是什么?在linux内核的NUMA系统或者类NUMA系统,内核策略决定了内核将从那个node分配内存。linux自从2.4.?就已经支持了非统一内存访问(NUMA Non-Uniform Memory Access)平台。现在的内存策略支持是在大约2004年五月被加入到linux2.6的。这篇文档试图描述2.6内存策略支持的概念和API。......

2021-06-29 21:42:52 330

翻译 【kernel doc】【trace】kprobetrace翻译

原文链接:Kprobe-based Event Tracing概述这些事件类似于基于tracepoint的事件。 但不同于Tracepoint,它基于 kprobes(kprobe 和 kretprobe)。 因此它可以探测 kprobes 可以探测的任何地方(这意味着,除了带有 __kprobes/nokprobe_inline 注释和标记为 NOKPROBE_SYMBOL 的那些函数之外的所有函数)。与基于 Tracepoint 的事件不同,它可以动态添加和删除。要启用此功能,请使用 CONF

2021-06-27 16:35:47 173

翻译 【kernel doc】【trace】ftrace - Function Tracer

原文链接: Function Tracer介绍  Ftrace是一个内部的tracer,用以帮助系统开发者和设计者来知道内核正在做什么。它可以用来调试或者分析用户空间的延迟和性能问题。  尽管 ftrace 通常只被认为是函数tracer,但它实际上是多个跟踪实用程序的框架。  在检测中断禁用和启用之间,以及抢占和从任务被唤醒到任务实际调度的时间发生的事情时,是有延迟的。  ftrace最常用的一个用法是事件跟踪。内核中有数百个静态事件点,可以通过 tracefs 文件系统启用它们,以查看内核某些

2021-06-27 15:55:23 431

原创 tcp

可靠数据传输:  RFC6298定时器管理:这个rfc文档推荐使用单一的重传定时器,而不是为每个报文都启动一个定时器。可以理解为这个单一的重传定时器仅与最小的未确认报文相关联  假设c向s发送A B C三个报文,s只收到了A和C报文并发送两次A的ack,那么s就会在收到A的ack时重启定时器,直到定时器超时重传B报文  超时间隔加倍:如果超时发生后,第二次超时时间将会加倍  快速重传:如果连续收到了3个ack,则直接重传(基于累计确认和冗余ack)  GBN还是SR:计算机网络自顶向下阅读笔记:滑

2021-02-22 16:00:24 71

原创 运输层的多路复用与多路分解

进程并不直接把数据交给运输层,而是把数据交给套接字,由套接字把数据交给运输层。由于每个主机上有多个套接字存在,所以就需要为每个套接字提供一个唯一标识,这个标识就是常说的主机的端口号为了知道每个报文是发往哪个主机的哪个进程的,所以有了ip协议的ip地址和tcp/udp协议的端口号ip地址提供主机到主机的运输,端口号提供同一主机内向多个进程的多路分解。UDP套接字是由一个二元组标识的,该二元组包括目的IP地址和目的端口号。因此,如果两个UDP报文有不同的源IP地址或源端口号,但有相同的目的IP地址和目的端

2021-02-20 15:27:19 177

原创 【leveldb】basename/dirname中的坑

最近阅读leveldb中代码的时候发现,leveldb自己实现了basename和dirname的功能,并没有使用glibc自带的函数,觉得比较奇怪,去查文档然后动手实践后发现原来这里面有个一不小心就会踩到的坑。man手册中提到,posix版本的glibc实现会改变basename/dirname的参数,而且在使用静态字符串如/usr/调用时会引起段错误。自己调试发现,dirname会改变参数,并将最后一个/改成\0,如下执行到dirname时,原来的这个字符串p就已经被改变了,并且导致strlen

2021-01-19 20:45:44 289

原创 python实现linux下ls -l的命令

代码#!/usr/bin/env python3#coding=utf-8import osimport shutilfrom stat import *import pwdimport grpimport tracebackimport timedef llist(path='.'): try: for name in os.listdir(path): # get stat info si = os.stat(

2021-01-18 13:52:39 486 2

原创 【leveldb】从EncodeFixed64来看汇编层面的性能优化

前言  最近在读leveldb的代码,看到了EncodeFixed64的写法感觉很不解,为什么要写的这么繁琐晦涩,把整数存在一个char数组中不是一句sprintf就解决了吗?深挖之后,还真不是这么简单从git提交记录查起  从github上看关于这个函数最近的一个提交,Remove leveldb::port::kLittleEndian。  提交内容中写道:Clang 10包含了以下描述的优化https://bugs.llvm.org/show_bug.cgi?id=41761。 这意味着 {D

2021-01-16 16:39:07 443 1

原创 【leveldb】varint 讲解和实现

前言  leveldb中为了减少内存占用,使用了varint这一数据结构,把数字放到字符数组中来表示,思想就是把小数字用尽量少的字节来表示,每个字节只使用其中的7位,最高位用来表示是否还有剩余的数字,0代表没有,1代表有。encode代码下面是encode的代码#include <stdio.h>#include <inttypes.h>#include <string>char *encode_varint32(char *dst, uint32_t

2021-01-08 00:52:06 427

原创 性能分析工具

perf安装:yum install perf -y使用:perf record ./a.outperf report可以看到各个函数花费的时间。

2020-12-22 19:00:27 172

原创 【网络编程】网络编程的坑

echo服务阻塞  假设这样一个简单的echo场景:客户端向服务端发送20M的数据,发送完之后接收数据,而服务端每次接收4k数据,接受完全部数据之后进行回显。这样的客户端和服务端程序启动之后,会意外的阻塞。阻塞的点在哪里呢  因为客户端发送完数据之后才会进行接收数据,而服务端接收到了4k数据之后就会进行回显,这时服务端发送到客户端的内核缓冲区中,注意这时客户端并没有读取数据,所以客户端的接收缓冲区中的数据一直积累,直到积累到某个阈值,此时服务端的tcp advertised window大小为0,tcp

2020-12-18 18:44:06 223 2

原创 【linux0.12】超级块、缓冲块、i节点等数据结构

因为代码中很多地方都用到了这几种数据结构,所以还是统一的放在一篇文章中把。缓冲头结构struct buffer_head { char * b_data; //指向真正缓冲块的指针 unsigned long b_blocknr; //数据的逻辑块号 unsigned short b_dev; //设备号 unsigned char b_uptodate; //更新标识:数据是否更新(有效),理解为有效更好

2020-12-16 16:22:39 345

原创 【linux0.12】i节点操作

TODO

2020-12-14 14:08:36 332

原创 【linux0.12】从open系统调用到磁头柱面扇区下篇-----代码讲解

文章目录前言sys_open前置知识代码讲解总结open_namei代码讲解总结dir_namei代码讲解总结get_dir代码讲解其他follow_link总结前言  本文只是讲解打开常规文件(不是块设备文件、字符设备文件等)过程中的主要逻辑,包括目录项的查找,文件名到i节点的映射,i节点的使用,盘块的使用,请求队列的组织与使用,限于篇幅也不会面面俱到的把代码中每个细节都讲到,只讲解其中的骨架代码,一些细节部分如i节点管理与操作,目录项管理与操作等放在单独的文章中讲解,防止主次不分。另外代码中还含有高

2020-12-13 16:47:18 160

原创 【linux0.12】盘块位图和i节点位图的管理与操作

TODO

2020-12-13 15:41:15 586

原创 【linux0.12】目录项管理与操作

TODO

2020-12-13 13:44:25 195

原创 Google C++编程风格指南阅读笔记之命名、注释和格式

前言本文源自Google C++编程风格指南,砍掉了其中比较common的部分,保留了个人认为最有价值的部分,并合入了自己的理解。原文下载连接:Google C++编程风格指南命名约定类型命名类型名称的每个单词首字母均大写,不包含下划线如:MyExecitingClass,IOService变量命名变量名一律小写,单词之间使用下划线连接。类和结构体的成员变量以m_开头(原文是类的成员变量以_结尾,结构体不用)枚举命名枚举的命名应当和宏一致宏的命名宏的命名使用全大写字母加下划线,如MY_M

2020-12-11 16:58:55 274

原创 【linux0.12】文件高速缓冲区管理

概述  为什么要有高速缓冲区?直接对磁盘进行IO操作的速度与内存和cpu处理的速度是相比是非常慢的,为了提高系统性能,设立了高速缓冲区。内核访问块设备中的数据,都需要经过高速缓冲区来间接地进行操作。  高速缓冲区对外提供了三个接口,块读取函数bread、块提前预读函数breada和页块读取函数bread_page,页块读取函数一次读取一页内存所能容纳的缓冲区块数(4块)。我们只讲解其中的bread函数,用户只需提供设备号和逻辑块号就可以通过bread来进行操作高速缓冲区,以达到间接操作磁盘的目的。  

2020-12-10 09:09:49 299

原创 sourceInlight解决symbol not found的问题

原因是有的文件没有被导入,比如.inl文件解决方法:1. 点Options中的File Type Options选项2. 增加.inl类型的文件3. 点击Project选项中的Add and Remove Project Files4. 点Add All并勾选第二个选项:递归增加子目录5. project 选项卡并点击Synchronize Files6. 勾选强制解析所有文件,然后start...

2020-12-04 10:39:55 489

翻译 17.2.1.1 基于语句和基于行的复制的优势和劣势

每个binary log记录格式都有优势和劣势。对于大多数用户,混合复制格式会提供数据完整性和性能的最佳结合。但是,如果要在执行某些任务时利用特定于基于语句的复制格式或基于行的复制格式的功能,则可以使用本节中的信息,该信息概述了它们的相对优缺点, 确定最适合您的需求。 基于语句复制的优势 基于语句复制的劣势 基于行复制的优势 基于行复制的劣势基于语句复制的优势 成熟的技术。 向日志文件写入最少的数据。当更新或删除影响许多行时,这将导致日志文件所需的存储空间大大减少。 这也意味着从备

2020-11-25 21:29:11 140

翻译 17.2.1 复制格式

17.2.1.1 基于语句和基于行复制的优势和劣势17.2.1.2 基于行记录和复制的用处17.2.1.3 确定二进制日志中安全和不安全的语句复制之所以有效,是因为从源读取了写入二进制日志的事件,然后在副本上对其进行了处理。根据事件的类型,binary log中事件是以不同格式来记录的。当事件被记录到源的binary log中时,对应不同的bianry log记录格式,会用不同的复制格式。二进制日志记录格式与复制期间使用的术语之间的相关性是: 当使用基于语句的binary log记录时,源会写sq

2020-11-25 21:28:26 105

翻译 17.2节 复制的实现

17.2.1 复制格式17.2.2 复制通道17.2.3 复制线程17.2.4 relay log和复制元数据仓库17.5.2 服务器如何评估复制过滤规则复制是基于源服务器跟踪binary log中数据库的所有变化。binary log服务器用作从服务器启动以来修改数据库结构或内容(数据)的所有事件的书面记录。典型地,select 语句并不会被记录因为它们没有修改数据库结构或者内容。每个连接到源的副本会请求binary log的一份拷贝。也就是说,它从源拉数据,而不是源推数据到副本。副本也会执行

2020-11-25 21:26:47 97

翻译 第17.1.2节 设置基于binary log文件位置的复制

17.1.2.1设置复制源配置17.1.2.2设置副本配置17.1.2.3创建用于复制的用户17.1.2.4获取复制源二进制日志坐标17.1.2.5选择数据快照的方法17.1.2.6设置副本17.1.2.7在副本服务器上设置源配置17.1.2.8将副本添加到复制环境这节讨论了如何设置mysql服务器以使用基于binary log文件位置的复制。有很多不同的方法来设置复制,具体的方法取决于你怎样设置复制和你想要复制的源的数据库是否有数据。所有设置都有一些通用的任务: 在源上,你必须保证启

2020-11-25 21:25:03 57

翻译 第17.1.2.8节 添加副本到复制环境

你可以添加其他的副本到一个已存在的复制配置中,而不用停止源服务器。为了做到这个,你可以通过已存在副本的数据目录和给新的副本一个不同的服务器ID(用户指定),和服务器UUID(启动时生成)来设置新的副本。为了复制一个已存在的副本:停止已存在的副本并且记录副本状态信息,尤其时源的binary log文件和relay log文件位置。您可以在Performance Schema复制表(请参见第26.12.11节“ Performance Schema Replication Tables”)中查看副本状态

2020-11-24 21:37:37 86

翻译 第17.1.2.7节 设置副本上的源配置

要设置副本以与复制源进行通信,请为副本配置必要的连接信息。 为此,请在副本上执行以下语句,将选项值替换为与系统相关的实际值:注意复制不能使用unix sockct 文件。你必须能够使用TCP/IP连接到mysql源服务器。CHANGE MASTER TO语句同样有其他的选项。例如,可以使用SSL设置安全复制。对于完整的选项列表,和有关字符串值选项的最大允许长度的信息,请参见第13.4.2.1节“ CHANGE MASTER TO语句”。重要如在17.1.2.3节”为复制创建用户”中提到的,如果您

2020-11-24 21:36:56 39

翻译 第17.1.2.6节 设置副本

以下各节介绍如何设置副本。 在继续之前,请确保您具有: 使用必需的配置属性配置了源。 请参见第17.1.2.1节“设置复制源配置”。 获取源状态信息,或在关闭数据快照时生成的源二进制日志索引文件的副本。 请参见第17.1.2.4节“获取复制源二进制日志坐标”。 在源上,释放读锁: 在副本上,编辑mysql配置。参见17.1.2.2节,设置副本配置接下来的步骤取决于你是否有已存在的数据导入副本。参见17.1.2.5节,”为数据快照选择一个方法”的更多信息。选择下列之一: 如果没有要导入

2020-11-24 21:36:16 138

翻译 第17.1.2.5节 为数据快照选择一个方法

如果源服务器包含已存在的数据,那么有必要把这些数据拷贝到每个从服务器。有多种方法可以从源数据库中转储数据。 以下各节介绍了可能的选项。要选择转储数据库的适当方法,请在以下选项之间进行选择: 使用mysqld工具来创建你想要复制的所有数据库的转储。这是推荐的方法,尤其使用InnoDB时 如果你的数据库存储在二进制可移植文件中,你可以拷贝文件到副本。这比使用Mysqldump更高效并且在每个副本上导入了文件,因为它会在重放INSERT语句时跳过更新索引的开销。这种方法不建议使用InnoDB等存储引擎。

2020-11-24 21:34:28 66

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除