- 博客(1642)
- 资源 (107)
- 收藏
- 关注
原创 linux读文件过程-3.10.0-Start From read
从系统调用read开始,其系统调用实现如下,传入的参数是打开的文件句柄,用户区缓冲池,读取长度:SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count){ struct fd f = fdget_pos(fd); ssize_t ret = -EBADF; if ...
2018-06-08 22:42:59 584
原创 systemtap概述及实例
systemtap对用户级和内核级代码提供了静态和动态跟踪的功能。Systemtap采用其他的内核框架做源:静态探针用tracepoints、动态探针用kprobes、用户级别的探针用uprobes。这些源也为perf、LTTng所用。由于 systemtap 运行需要内核的调试信息支撑,默认发行版的内核在配置时这些调试开关没有打开,所以安装完systemtap也是无法去探测内核信息的。Syste...
2018-06-06 20:01:36 1377
原创 dd命令的另类分析
今天想看下dd命令启动后调用的系统调用。于是就用strace了一把,考虑到dd命令是需要带参数的,所有执行一个字节的写,写10次,所在文件系统为xfs, 执行如下。 如下,注释直接加下输出的内容中了:# strace dd if=/dev/zero of=test.log bs=1 count=10execve("/usr/bin/dd", ["dd", "if=/dev/zero", "of=...
2018-06-05 16:35:53 1005 1
原创 linux内核模块导出函数
一个模块可以使用另一个模块导出的函数,可以通过函数EXPORT_SYMBOL(func_name)来导出,导出后的函数位于/proc/kallsyms文件中。1. 导出代码:#include <linux/init.h>#include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_i...
2018-06-04 11:16:32 1574
原创 调试Linux内核操作指南(withing kgdb)
kgdb在内核2.6.26中加入,用于调试内核。kdb是内建的内核调试器,由SGI开发。 两者差异是:使用kgdb需要两个机器,通过网络连接,其中客户端使用gdb。而kdb可以直接在目标机器上调试。Kgdb支持C代码级别调试,可以识别内核数据结构,而kdb只能识别汇编级别。 这里两台机器(使用的是两台VBox的虚拟机),一个是目标机器(被调试内核的机器),另一台是开发机器(连接被调试内核的机器)...
2018-06-02 10:32:19 908
原创 Linux中ip路由子系统剖析
linux有很多子系统,例如IPv4子系统,进程管理子系统,pci子系统等,这次我们要面对的是路由选择子系统,久闻其大名却不曾亲近,让我们一起来看下。Linux网络栈最重要的目标之一就是转发流量,对骨干网中的核心路由器尤其如此。IP栈层也被称为路由选择子系统负责转发数据包和维护转发数据库。先介绍两个路由选择术语:默认网关和默认路由。在路由选择表中不与其他路由选择条目匹配的数据包都将转发到默认网关。...
2018-05-30 11:26:04 1640
原创 Python的pyroute2网络模块
Pyroute2是纯python的netlink库,只需要python标准库不需要其他第三方的库。最常用的是监控事件,例如监控磁盘空间事件:from pyroute2 import DQuotSocketwith DQuotSocket() as ds: for message in ds.get(): print(message)或者监控IP路由from pyroute2 i...
2018-05-28 14:30:11 2462
原创 云计算下虚拟网络设备基础概述
云时代下服务器主要都是虚拟机和容器,其背后的网络都离不开虚拟网络设备,了解虚拟网络设备有利于更好的理解云计算的网络结构。我们一起来看下Linux下的虚拟网络设备。对于Linux内核网络设备管理模块来说,虚拟设备和物理设备没有区别,都是网络设备,都能配置IP,从网络设备来的数据,都会转发给协议栈,协议栈过来的数据,也会交由网络设备发送出去,怎么发送出去的,发到哪里去取决于虚拟网络设备的驱动实现。我们...
2018-05-28 13:07:48 1428
原创 Linux中nvme驱动详解
NVMe离不开PCIe,NVMe SSD是PCIe的endpoint。PCIe是x86平台上一种流行的bus总线,由于其Plug and Play的特性,目前很多外设都通过PCI Bus与Host通信,甚至不少CPU的集成外设都通过PCI Bus连接,如APIC等。 NVMe SSD在PCIe接口上使用新的标准协议NVMe,由大厂Intel推出并交由nvmexpress组织推广,现在被全球大部分...
2018-05-25 11:35:03 19969 2
原创 linux中用户和内核空间的交互接口汇总
内核提供接口给用户空间程序,便于用户进行进行信息的读取和配置。procfs和sysctl都可以导出内部信息,其中procfs主要用于导出只读信息,sysctl导出可写的。此外还有sysfs,ioctl1. procfsprocfs是内核提供的,一种在用户空间中对各种子系统的设置进行配置的方式,通常挂载在/proc下。 网络代码注册的文件位于/proc/net目录中2. sysctl系统调用...
2018-05-24 20:25:28 2077
原创 linux网络命名空间及使用
从逻辑上说,网络命名空间是网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。网络命名空间可以营造出多个内核网络栈实例的假象。网络命名空间的结构为net,定义在文件include/net/net_namespace.hstruct net { refcount_t pa...
2018-05-23 20:21:44 1124
原创 Linux通知链机制及实例
Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,要使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施。内核实现了事件通知链机制(notification chain)。通知链只能用在各个子系统之间,而不能在内核和用户空间进行事件的通知。通知链是一个函数列表,当给定事件发生的时候予以执行。每条通知链都有被通知者和拥有者。拥有者定义列表,被通知的子系统选择要执...
2018-05-22 15:52:22 2026
原创 关于PPPoE协议
PPPoE英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ethernet)框架中的一种网络隧道协议。本质上,它是一个允许在以太网 广播域中的两个以太网接口间创建点对点隧道的协议。PPPoE是一种用于将多个客户端连接到远程场点的规范。PPPoE协议在1999年发布在RFC2516中规范。PPPoE包含两...
2018-05-17 12:05:07 1829
原创 linux中PCI子系统补充
相关知识:《linux中pci设备》很多网络接口卡都是PCI设备,必须与Linux PCI子系统协同工作。新的PCI设备是PCI Express设备.PCI设备都有只读的配置空间,可以通过lspci命令来读取。 #lspci -xxx可以查看PCI配置空间内容的十六进制表示 #lspci -xxxx可以查看扩展PCI配置空间内容的十六进制表示当然linux PCI API提...
2018-05-17 10:19:14 1225
原创 Linux中频繁轮询套接字
当套接字队列变空后,网络栈此时就空闲了,终于可以静一静了。可以选择休眠等待驱动程序将其他数据加入套接字,也可以以非阻断方式返回。 为了实现以CPU使用率换取延迟尽可能低,内核在3.11起提供了频繁轮询套接字的功能。最初叫做低延时套接字轮询后根据Linus建议更名为频繁轮询套接字。 要支持频繁轮询,网络驱动程序必须提供频发轮询方法,并将其作为net_device_ops对象的...
2018-05-17 09:07:12 400
原创 Linux中netfilter模块编程实践
上篇我们看了netfilter的实现机制,这篇来实现下netfilter模块实操一把。为了注册一个钩子,需要填充nf_hook_ops结构体,包括优先级,钩子地点和钩子函数。然后调用nf_register_hook()函数。1. 数据结构 struct nf_hook_ops { /* User fills in from here down. */ nf_hoo...
2018-05-16 21:49:21 3165
原创 linux中通用Netlink详解及使用剖析(附源码)
相关部分可以参考之前文章:《netlink机制》因为Netlink协议簇不能超过32个,而且添加协议簇需要在include/linux/netlink.h中添加协议簇定义。因为开发了通用netlink,类似netlink的多路复用器,因为提供了通用的渠道,所以可以在其他子系统使用,例如ACPI、任务统计信息、过热事件等。1.1.1 协议族通用link协议由family来管理,其中genl_ctrl...
2018-05-14 13:08:31 8489
原创 Linux中通过/dev/mem操控物理地址
/dev/mem是物理内存的全映像,可以用来访问物理内存,用mmap来访问物理内存以及外设的IO资源,是实现用户空间驱动的一种方法我们先用hexedit来看下/dev/mem,hexedit /dev/mem 可以物理内存的信息,当然肉眼是无法看的毕竟是16进制。00000000 53 FF 00 F0 53 FF 00 F0 53 FF 00 F0 53 FF 00 F0 S...S...
2018-05-11 14:58:29 3080
原创 eBPF监控工具bcc系列九bcc Python
接下来看下python方面的知识。1. 初始化1.1 BPF语法:BPF({text=BPF_program | src_file=filename} [, usdt_contexts=[USDT_object, ...]])创建一个BPF对象,能通过交互来产生输出。1.2 USDT语法:USDT({pid=pid | path=path})创建对象来使用USDT,可以指定进程...
2018-05-09 17:16:48 2463
原创 eBPF监控工具bcc系列八BPF C
在之前的bcc代码中我们知道其程序是分为两部分的,一部分是C语言,另一部分是基于Python的。本篇是关于C语言部分的。1. 事件和参数1.1 kprobes使用kprobe的语法是:kprobe__kernel_function_name其中kprobe__是前缀,用于给内核函数创建一个kprobe(内核函数调用的动态跟踪)。也可通过C语言函数定义一个C函数,然后使用python的B...
2018-05-09 17:16:25 5413 2
原创 eBPF监控工具bcc系列七开发脚本
bcc开发脚本有两种方式,一种是基于python接口,另一种是基于ruby接口,我们看的是基于python接口的。本篇的前置条件是系统中已经安装好了bcc。1. Hello world输入代码如下:#!/usr/bin/env pythonfrom bcc import BPFBPF(text='int kprobe__sys_clone(void *ctx) { bpf_trace_prin...
2018-05-09 17:15:59 1137 1
原创 eBPF监控工具bcc系列六工具查询列表
关于trace,argdist,funccount三个工具已有专门篇章介绍。所有脚本位于bcc/tools文件夹中。execsnoop跟踪新进程创建,跟踪exec函数。bashreadline打印系统中所有bash上运行的命令,通过跟踪readline()函数实现。biolatency跟踪块设备IO,记录IO延时分布并输出直方图。biosnoop跟踪块设备IO,为每个IO打印一行。biotop是块...
2018-05-09 17:15:31 1718 1
原创 eBPF监控工具bcc系列四工具argdist
argdist工具用于探测指定的函数,并收集参数到一个直方图和频率计数器。可以在没有调试器的情况下,过滤并打印敢兴趣的参数,从而理解指定参数的分布图。例如像知道一个应用中的内存分配块大小情况,可以指向如下:./argdist -p 2420 -c -C 'p:c:malloc(size_t size):size_t:size'如果要变成柱状图,参数修改成-H即可。./argdist -p 2420...
2018-05-08 11:12:23 897
原创 eBPF监控工具bcc系列三自定义工具trace
上篇中是通用的直接可用工具。 trace工具可以指定跟踪函数并显示,可控制其输出格式来显示函数参数和返回值。例如跟踪文件拥有者的属性更改,也就是跟踪三个文件系统调用chown,fchown,lchown。使用如下:trace.py 'p::SyS_chown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, ...
2018-05-08 11:11:55 1077
原创 eBPF监控工具bcc系列二性能问题定位
这里将问题诊断分为两个阶段,第一阶段是定性分析,第二阶段是是用bcc进行定量分析。1. 阶段一在使用bcc工具前,先要进行基本的系统性能判断,如下十个步骤,可以1到2分钟之内观测完毕。相关脚本可以参考https://github.com/kernel-z/LinuxProfilingl  uptimel  dmesg | taill  vmstat 1l  mpstat...
2018-05-08 11:11:31 1210
原创 eBPF监控工具bcc系列五工具funccount
funccount函数可以通过匹配来跟踪函数,tracepoints 或USDT探针。例如所有以vfs_ 开头的内核函数。./funccount 'vfs_*'这个对于探索内核代码很有帮助,可以找出哪个函数在使用那个函数没在使用。也可以设置间隔,每秒打印一次:./funccount -i 1 'vfs_*'跟踪所有tcp函数。./funccount 'tcp_*'当执行Ctrl+C进行取消跟踪的时...
2018-05-08 11:03:54 658
原创 eBPF监控工具bcc系列一启航
在eBPF篇中,我们知道虽然可用 C 来实现 BPF,但编译出来的却仍然是 ELF 文件,开发者需要手动析出真正可以注入内核的代码。工作有些麻烦,于是就有人设计了 BPF Compiler Collection(BCC),BCC 是一个(基于 C 和 C++) python 库,实现了对 BCC 应用层接口的封装。 使用 BCC 进行 BPF 的开发仍然需要开发者自行利用 C 来设计 BPF 程...
2018-05-07 10:42:24 2512
原创 Linux未来监控tracing框架——eBPF
eBPF源于早年间的成型于 BSD 之上的传统技术 BPF(Berkeley Packet Filter)。BPF 的全称是 Berkeley Packet Filter,顾名思义,这是一个用于过滤(filter)网络报文(packet)的架构。BPF 是在 1997 年首次被引入 Linux 的,Linux 内核中的报文过滤机制其实是有自己的名字的:Linux Socket Filter,简称 ...
2018-05-07 10:35:55 2460
原创 Linux块设备开发详解及代码(版本3.10.0)
不同于字设备,高效的块驱动对于性能至关重要,它是核心内存和二级存储之间的管道,所以块层的设计必定围绕性能。 找源码的,请直接往下翻(在3.10.0版本可编译使用)。1. 注册编号大部分块驱动采取的第一步是注册它们自己到内核. 这个任务的函数是 register_blkdev(在 <block/genhd. h> 中定义):int register_blkdev(unsigned ...
2018-05-03 11:34:06 1622
原创 Linux磁盘高速缓存
磁盘高速缓存是一种软件机制,允许系统把通常存放的磁盘上的一些数据保留在RAM中。例如,目录项高速缓存(dentry cache),加速从文件路径名到最后一个路径分量的索引节点转换过程。Linux还有其他磁盘高速缓存,如页高速缓存、缓冲区高速缓存。这里需要注意缓存和缓冲的差异,缓冲是buffer,缓存是cache。2.4之前的内核中有两种缓存,一种是vfs的页高速缓存,另外一种是缓冲区高速缓存,缓冲...
2018-05-02 09:56:56 1308
原创 linux tracing和profiling概论
在工作中经常用到各种跟踪调试工具, strace, ltrace, kprobes, tracepoints, uprobes, ftrace, perf, 和 eBPF。他们之间到底啥关系?本文从总体上进行概述,如果有错误欢迎指正。1.1.1 系统跟踪系统跟踪可以分为数据源、收集数据机制和跟踪前端(收集和分析数据的交互)。数据源可以将其分为probes和tracepoints,对应的源有:pro...
2018-05-01 11:51:17 1022
原创 linux文件系统系统调用实测的一个方法
通过几个C代码来检测一下文件系统相关系统调用时间,以及和标准I/O库函数的性能差异。主要以read和fread函数为例。1.1.1 read系统调用开销我们来模拟一下read系统调用的开销情况,代码如下:#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h&...
2018-04-23 23:03:38 595
原创 linux内存初始化初期内存分配器——memblock
1.1.1 memblock系统初始化的时候buddy系统,slab分配器等并没有被初始化好,当需要执行一些内存管理、内存分配的任务,就引入了一种内存管理器bootmem分配器。当buddy系统和slab分配器初始化好后,在mem_init()中对bootmem分配器进行释放,内存管理与分配由buddy系统,slab分配器等进行接管。 而memblock是用来替代bootmem的新接口...
2018-04-23 13:47:39 744
原创 start_kernel启动函数——简版
start_kernel函数是内核的入口函数,定义在init/main.c文件中。我们来一个一个函数看。asmlinkage __visible void __init start_kernel(void){ char *command_line; char *after_dashes; set_task_stack_end_magic(&ini...
2018-04-21 20:54:21 3798
原创 linux内存管理——mmap函数详解
mmap函数是unix/linux下的系统调用。当存在客户-服务程序中复制文件时候,其数据流如下,要经历四次数据复制,开销很大。 如果采用共享内存的方式,那么将大大优化IO操作,数据流变成了如下,数据只复制两次: 映射文件或设备到内存中,取消映射就是munmap函数。语法如下:void *mmap(void *addr, size_t length, int prot, int flags, ...
2018-04-20 15:13:10 9955
原创 Docker技术实践——高级篇
1.1 搭建私有仓库我们需要看下如何搭建容器的私有仓库:Mavan的管理一样,Dockers不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库。私有仓库有许多优点:1.节省网络带宽,不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;2.提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。#docker pull...
2018-04-18 15:58:27 2153 1
原创 Docker技术实践——中级篇
1.1 存储机制每个镜像由多个镜像层组成,镜像层都是只读的,从下往上,以栈方式组合在一起,组成容器的根文件系统。镜像文件默认保存在主机的/var/lib/docker/volumes中。容器层是可读写层。每个容器运行时都有自己的容器层,保存容器运行相关的数据,容器层之下的所有镜像都是只读的,多个容器可以共享一个镜像。容器层是保存在/var/lib/docker/containers路径。每...
2018-04-18 15:56:33 526
原创 Docker技术实践——初级篇
这是一篇关于Docker技术的初级文档,主要针对Docker的babies。当然,如果是老鸟也欢迎温故知新。2. Docker组件(C/S)Docker组件分为客户端和服务端。Docker Client:Docker的客户端Docker Server: Docker daemon的主要组成部分,接收用户通过Docker Client发送的请求,按照相应的路由规则实现路由分发。Docker R...
2018-04-18 15:53:42 636
原创 Linux进程通信IPC
进程间通信IPC技术在其发展过程经历了一些变化,另外其包含众多技术概念,如果不从系统上去梳理一番容易迷失在这信号森林。IPC是进程间通信的简称,不同的信息共享有多种方式如下图:进程组对于进程间的通信机构——信号来说,是非常有用的。其发展规律如下:Unix IPC包括:l  最初的管道、FIFO、信号;l  System V IPC包括:System V消息队列、System V信号量、...
2018-04-17 16:10:27 410
DB2_docview
2018-07-21
Oracle-NUMA绑定脚本
2018-07-21
HP Superdome X扩展性
2018-07-21
Linux块层技术剖析-v0.1
2018-07-21
Infrastructure_Matters_POWER8_vs_XEON_x86-IBM官网引导的报告-中文
2018-07-19
oracle数据库大会6共6个
2018-07-19
oracle数据库大会4
2018-07-19
oracle数据库大会材料1
2018-07-19
CON1101_Crawford_jr-CON1477_Hu_ExadataMAA-Best-Practice_v2_EN_
2018-07-19
459334-oracle_vm3-application-driven_virtualization
2018-07-19
129255-oracle_timesten_in-memory_database
2018-07-19
SPECjEnterprise 2010 Performance Update
2018-07-19
characterizing configuration problems in Java EE.pdf
2018-07-19
oracle循环插入
2018-07-19
SQL Server健康查询
2018-07-19
HammerDB测试TPC-H
2018-07-19
MRD_Early_Bird_Training
2018-07-19
oracle-实时决策(In-memory)-案例-材料
2018-07-19
DWGL数据仓库全球领导课程
2018-07-19
Exadata-的核心进程-SHOUG成员Steven.Lee_.pdf
2018-07-19
DTCC2016中国数据库技术大会会议全部材料
2018-07-19
RDMA编程用户手册-官方中文版
2019-03-23
09 SYBASE官方文档合集
2018-07-24
Linux虚拟文件系统全面剖析——打开、读、写逻辑v0.1
2018-07-24
db2perfsupport使用指南
2018-07-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人