自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序猿Ricky的日常干货

学而不思则罔,思而不学则殆! ([email protected]

  • 博客(336)
  • 资源 (4)
  • 收藏
  • 关注

原创 案例分析 - OOM的内存分析

当Linux系统由于内存不足而触发了oom killer时,会在内核log中输出相关的内存信息,按照信息类型分为这几部分来介绍。第1部分首先输出的是整机的内存信息,按照指标分行整理后显示如下:Mem-Info:active_anon:81208569inactive_anon:209684 isolated_anon:0#012 active_file:72830 inactive_file:121873 isolated_file:0#012 unevictable:15512

2021-05-07 12:22:27 1638

原创 案例分析 - 内存泄露的排查方法

查看系统meminfo查看系统内存情况:free -h查看meminfo,:/proc/meminfo :对于内存泄露的问题,需要关注的主要有:MemTotal: 32571632 kBMemFree: 3910664 kBMemAvailable: 7495000 kBBuffers: 124784 kBCached: 6162332 kBSwapCached: 0 kB...Sla

2021-04-29 16:05:29 3015

原创 Trace - 一文读懂tracepoint

tracepoint是Linux内核静态定义的一些调试点,它分布于内核的各个子系统中,然而在实际工作中可能很多人并没有用过这个功能,或者对它没有太多了解,那么就通过本文一起来了解下tracepoint吧。tracepoint是内核预先定义的静态探测点,可以用于挂载钩子函数来做trace。当没有钩子函数时,它几乎没有损耗,只有挂载了钩子函数才会真正启用trace功能。这个钩子函数可以由开发者编写内核module来实现,并且需要在钩子函数中获取我们调试所需要的信息并导出到用户态,这样我们就可以获取内核运行时的信

2021-04-23 15:12:46 7193

原创 Linux跟踪系统调用耗时的方法(高级篇)

可以使用很多种办法来trace内核系统调用耗时,比如:使用perf probe功能使用ftrace功能使用bpftrace使用bcc使用systemtapbpftrace使用bpftrace可以比较简单的实现该功能,直接使用单行命令即可:bpftrace -e 'tracepoint:syscalls:sys_enter_write { @entry[tid]= nsecs;} tracepoint:syscalls:sys_exit_write /@entry[tid]/ {$inte

2021-03-17 17:01:22 1860 3

原创 使用bpftrace进行内核跟踪

bpftrace工具用法单行命令工具:bpftrace -e 'program'bpftrace直接跟-e选项后面加单行命令,一些示例,比如:bpftrace -e 'BEGIN { printf("Hello world!\n"); }'bpftrace -e 'kprobe:vfs_read { @[tid] = count();}'bpftrace -e 'kprobe:vfs_read /pid == 123/ { @[tid, comm] = count();}'bpftrace

2021-03-10 15:48:40 5605 1

原创 如何查找x86-64平台上的内核堆栈位置

current宏在Linux 内核中负责获取当前cpu上的task_struct,通常是借助thread_info和内核栈实现我们需要先找到对应的内核栈,内核栈的栈底位置就是thread_info结构体:对于x86 64bit平台来说:DECLARE_PER_CPU(unsigned long, kernel_stack);212 213 static inline struct thread_info *current_thread_info(void)214 {215 struct

2021-01-07 10:42:25 678

原创 soft lockup的分类和定位方法

我之前已经写了lockup问题的检测原理,https://blog.csdn.net/rikeyone/article/details/112004920,本来就来尝试梳理一下soft lockup问题触发场景和解决方法。首先需要明确一点soft lockup是一类问题,引起它的原因也是各有不同,本文只是尝试做一些梳理,把一些具有共通性的特点的问题做一些总结,可能存在有不全面的地方。第一种场景:spinlock死锁场景对于这种场景,其实很好理解,当A-B/B-A死锁发生的时候,两个进程分别去获取对方持

2021-01-07 10:33:58 1069

原创 Linux跟踪系统调用耗时的方法(初级篇)

stracestrace -cp 1命令输出:strace: Process 1 attachedstrace: Process 1 detached% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ---------------- 28.09 0.000084 16 5

2021-01-05 11:31:17 958

原创 systemtap跟踪系统调用

systemtap查找系统调用点:stap -L 'syscall.*'查找系统调用返回点:stap -L 'syscall.*.*'比如open系统调用,找到的结果如下:syscall.opensyscall.open.return

2021-01-05 11:25:18 431

原创 soft lockup和hard lockup的检测原理

对于lockup问题处理,首先需要明确什么是lockup?它在什么情况下会被触发?本来就来聊聊这两种lockup是怎么检测的。soft lockup内核在每个CPU上都启动了一个watchdog线程,该线程被定期唤醒并记录per cpu的时间戳,同时启动的还有per-cpu的hrtimer,当hrtimer中断到来时会触发中断处理,在中断处理函数中会读取当前时间戳并与watchdog线程记录的时间做比较,如果两者相差超过一定范围(可以配置的watchdog_thresh)就会触发soft lockup异

2020-12-31 16:35:15 1873 1

原创 strace统计系统调用耗时

strace -cp 1命令输出:strace: Process 1 attachedstrace: Process 1 detached% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ---------------- 28.09 0.000084 16 5 clon

2020-12-28 11:33:40 1699

原创 perf trace跟踪系统调用

perf trace -p $pid --duration 50 命令输出如下: 0.076 (1249.922 ms): epoll_wait(epfd: 4<anon_inode:[eventpoll]>, events: 0x7ffe92ab3af0, maxevents: 36, timeout: 4294967295) = 1 1250.074 (1249.927 ms): epoll_wait(epfd: 4<anon_inode:[eventpoll]&gt

2020-12-28 11:32:28 3450

原创 perf sched命令跟踪调度延迟

使用perf sched命令抓取系统调度延迟:perf sched record -- sleep 15 抓取系统全局的sched信息perf sched latency -s max 解析perf数据中的sched latency信息perf sched script | grep 2862458.143656 -B 30 查看perf sched数据假如细化要求,抓取特定CPU上的调度延迟,可以使用如下方法:perf record -e sched:sched_wakeup,sc

2020-12-28 11:31:41 1324

原创 定位网络丢包内核路径的几种方法

第一个是 dropwatch# dropwatch -lkasInitializing kallsyms dbdropwatch> startEnabling monitoring...Kernel monitoring activated.Issue Ctrl-C to stop monitoring1 drops at icmp_rcv+11c (0xffffffff8193bb1c) [software]1 drops at icmp_rcv+11c (0xffffffff819

2020-12-10 17:44:47 1192

原创 浅谈虚拟交换机(vswitch)技术演进

虚拟化环境中,对于网络的连接有多种方式,以KVM为例,我们平时在使用libvirt或者qemu创建虚拟机时,可以选择NAT网络连接和bridge桥接网络连接。首先来调查一下这二者的实现区别是什么。基础虚拟网络桥接网卡首先来看下网卡桥接的连接方式,它相当于虚拟机和宿主机共用同一块物理网卡,虚拟机具有独立的IP地址,并且与宿主机所在网络处于同一个局域网,就相当于局域网中多了一台普通机器,可以直接访问局域网中的其他物理机,同一个局域网中的其他物理机当然也可以访问到该虚拟机。网络拓扑结构相当于下图所示:桥

2020-10-13 11:24:39 5944 2

原创 记一次更新网卡驱动的过程

驱动编译本机已经编译了内核,想要在该内核版本的网卡驱动中加一些调试信息,由于使用的是的intel的ixgbe驱动,于是自己修改了相关的代码,然后使用如下命令进行编译:make SUBDIRS=./drivers/net/ethernet/intel/ modules安装驱动编译生成的 ixgbe.ko 新驱动在./drivers/net/ethernet/intel/目录中,直接把该驱动模块替换到系统的模块安装目录。可以通过modinfo命令来查看相关驱动信息:[root@localhost ~

2020-09-17 10:48:11 1114

原创 为什么tcpdump抓包数据校验和异常、长度超过MTU?

内核实现tcpdump在抓取网络包时,实际它会创建一个socket,并且设置网卡为混杂模式,用于接收网络链路上所有地址的包。发送方向:dev_queue_xmit->dev_queue_xmit_nit:static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)

2020-09-16 14:38:25 2472

原创 聊聊网卡bond功能

如何查看机器中的网卡bonding情况查看是否存在bond网卡:ifconfig如何发现有带有 bondX 名字的网卡,那么说明本机是存在网卡bonding情况的。然后查看网卡bonding的情况:cat /proc/net/bonding/bond1cat这个节点会输出网络bonding的模式,已经由哪些物理网卡作为bonding slave。查看bond网卡配置:/etc/sysconfig/network-scripts/ifcfg-eth0/etc/sysconfig/netw

2020-09-16 11:48:20 2147

原创 SKB中的各种长度、数据指针和操作函数

skb结构体中的长度和数据指针len: 线性区和分片区域的总长度data_len:分片区域frag page中的数据长度len-data_len: 当前协议层中的线性区长度head:线性区的起始地址data:数据的起始地址tail:数据的结束地址end:线性区的结束地址headroom:从head到data之间的空间tailroom:从tail到end之间的空间除了上面的几个成员,特别指出一个truesize,它表示一个skb所消耗的内存,包括了skb结构体本身,skb shared i

2020-09-15 22:19:41 4742

原创 socket中的reuse addr和reuse port

SO_REUSEADDR(1)首先对于一个server服务进程来说,它的创建流程是socket->bind ->listen->accept创建监听套接字,bind一个指定端口,listen监听端口,为每个连接提供服务(一般会创建子进程)。当服务进程重启时,那么会重新执行一遍上面的流程,如果在创建socket后没有使用SO_REUSEADDR选项进行设置,再次进行bind就会失败。那么原因是什么?首先需要了解一下TCP协议的4次挥手动作,如文章开头的图片所示,当一个连接在关闭时.

2020-09-15 22:01:00 5095

原创 调用send发送网络数据包一定会立马发送出去吗?

Linux应用层调用了send发送网络数据,那么按照简单的思维,这个动作会触发网卡发送数据,而现实并不是如此!socket层首先对于send来说,分为阻塞发送和非阻塞发送:(1)阻塞操作内核会检测发送缓冲区是否存在足够的空间存放用户数据,如果空间足够那么直接拷贝数据到socket send buffer,后续发送动作交给协议栈来支持;如果空间不够那么send操作会阻塞,直到内核发送缓冲区空间足够,再数据拷贝到发送缓冲区,并最后返回用户空间。(2)非阻塞操作对于非阻塞操作来说,当发送缓冲区空间不够

2020-09-09 17:05:24 3263 1

原创 Linux系统平均负载是如何计算的?

关于负载的计算,它的结果是包含有小数的一个浮点数,内核中是不能使用float变量的,那么这里就采用了一个整型变量的低11位来表示小数部分。那么对于数值1来说,它就是FIXED_1,也就是需要对1进行左移11bit。实际上此时这个整型变量保存的值是1024。cat /proc/loadavg0.43 0.58 0.65 5/7010 45102那么我们通过cat命令查看负载值如上说是,它显示的是带有两个小数表示的一个浮点数,所以最后在输出这个数值时还需要做一个转换,如果从1024个值中得出这100小数

2020-09-03 17:58:27 3548 1

原创 从kprobe注销场景来探讨一下synchronize_sched的使用

首先抛出我的问题:当我在编译一个kprobe内核插桩模块时,我是这样实现的,先动态申请一块内存,用于存放我的kprobe结构体,然后执行kprobe的注册,完成一系列的内核数据收集之后,执行kprobe注销操作,最后释放内存,那么大家觉得我这个设计有问题吗?对于初学者可能觉得:没有什么问题呀?kprobe有注册和有注销,内存有申请有释放,怎么出问题的,实际上正确答案就是没有问题。。。哈哈,是不是感觉被我忽悠了一下。下面我来说说我当时的顾虑,由于我是动态申请的内存,kprobe机制是这样的,注册了对应k

2020-09-02 22:15:37 520

原创 为何used内存占用很大,但是在meminfo中找不到?

服务器上使用free查看内存使用情况,发现如下: total used free shared buff/cache availableMem: 250G 31G 196G 41M 22G 217GLow: 250G 54G 196GHigh: 0B

2020-09-02 19:40:31 1455

原创 x86-64平台栈帧结构与ARM64栈帧结构对比

x86-64ARM64差异点ARM64平台上的栈帧寄存器是FP,它记录的是一个函数执行过程中的栈顶(FP=SP),并且把父函数的FP保存在堆栈的栈顶,以便于回溯X86-64平台上的栈帧寄存器是RBP,它记录的是一个函数执行过程中的栈底,并且把父函数的RBP位置保存到本函数的栈底,以便于回溯...

2020-08-24 11:49:53 1930

原创 内核中的插桩调试

插桩法是内核常用的一种调试手段,利用代码中插桩,执行到此时执行对应的钩子函数(hook)来达到调试的目的,从实现来说,它不可避免的会带来一些性能上的开销,不过随着实现的不断优化,这部分的开销已经越来越小了。比如使能了 dynamic ftrace 后的内核,在关闭 ftrace 开关的情况下,实际上只是多了个几个 nop 指令,并不会带来很大的性能开销。下面就来看下内核中都有哪几种常用的插桩调试机制。ftrace 我在其他博客中有介绍过,它的原理是使用 gcc 编译器的 -pg 选项,达到在内核代码中插桩

2020-05-15 18:02:25 2052

原创 crash常用的调试命令

我的crash常用命令如下所示:log/dmesg: 打印出故障现场的kmsg缓冲区log_buf中的内容。struct:展示结构体的定义,或者从指定的地址开始解析一个结构体。union:与struct类似,但是用于union的展示p:print查看某个变量的值,实际上是调用gdb的p命令whatis:展示结构体、联合体等定义bt <pid>:展示调用堆栈信息,如果不加参数...

2020-05-08 11:07:25 8693

原创 对于MIGRATE_MOVABLE的理解

内存管理对于不同的zone管理区,都会划分为不同的memory block进行管理,这些memory block是按照2的幂次个页面进行管理的,对应的结构体如下:struct zone { ... /* free areas of different sizes */ struct free_area free_area[MAX_ORDER]; ...}...

2020-04-30 15:45:01 1414

原创 内核检测soft lockup事件特性

前面我已经介绍过 Linux内核故障分类和排查 这篇文章。通过前文,可以知道内核故障中有一类,叫做lockup,实际上就是死锁,分为soft lockup和hard lockup,对于hard lockup可能还需要平台的支持,那么本文就来模拟触发一下lockup的场景。在开始之前,需要做一下准备工作,编译内核,一定要打开如下的选项:CONFIG_LOCKUP_DETECTOR=yCONFI...

2020-04-27 20:07:38 2198

原创 page cache回写的几种触发方式

1.通过写入proc文件系统节点操作echo 3 > /proc/sys/vm/drop_cachesdrop_caches是会把所有page cache都释放或者写回的。2.sysctl设置系统参数配置flushd进程把脏页写回到磁盘的是时间间隔,单位是1/100秒,因此如下配置为5s的间隔:vm.dirty_writeback_centisecs = 500配置内存中脏页...

2020-04-27 09:35:12 1419

原创 oops堆栈分析实例

本文基于Linux-4.0,根据一个crash现场的实例,根据堆栈中的数据,反推整个函数调用流程,由于本例子存在oops,也会直接打印出backtrace,最终可以与我们的分析结果做一下比较,看看分析是否正确。/ # echo c > /proc/sysrq-triggersysrq: SysRq : Trigger a crashUnable to handle kernel NUL...

2020-04-24 15:06:43 1031

原创 Linux内核故障分类和排查

设备故障分为多种表现形式,可以把它分为3类:1.系统崩溃重启(panic)2.系统出现长时间无响应异常(hung)3.系统出现短暂卡顿(性能问题)针对第1类,一般引起的原因包括:软件bug、死锁(soft lockup、hard lockup)、指令异常abort、system error(SError)。(1)软件bug:指的时在代码上检测到运行到异常逻辑后调用BUG宏,从而产生oop...

2020-04-22 20:28:13 3034

原创 ARM64堆栈回溯

基于AAPCS64栈帧的组织方式先看一个实例代码程序:#include <stdio.h>int callee_func2(int a){ int b = 2; return a + b;}int callee_func1(int a){ int b = 1, c; c = callee_func2(a); return b ...

2020-04-20 15:47:58 3638

原创 开源项目mini-ipc简介

简介mini-ipc是一个进程间通信使用的开源库,由本猿独自开发的,可用于支持POSIX标准的类unix系统上。它的目标是为了更快速的实现用户空间的系统设计和应用设计。本库采用MIT-License开源协议,开发者可以使用这个开源库用于商业或者开源的项目中。基于mini-ipc可以实现一个消息驱动的应用系统,每个应用都会创建自己的消息队列,并且等待消息的处理,这样可以让一个复杂的系统分解为各个...

2019-12-15 19:49:28 2127 1

原创 开源项目-minios

简介minios 是使用QEMU实现的一个迷你 Linux 系统。它由 Linux 内核和 Rootfs 组成,Rootfs中包含了一系列的第三方基础库,比如 Libc , BusyBox 。这些都是操作系统运行的基础组件。利用 minios ,可以快速的构建一个 Linux 最小系统,包含有console和一系列的 busybox 命令。​利用 minios ,可以快速的构建一个 Linux ...

2019-12-15 19:44:32 3309

原创 Linux kernel oops

本文以ARM64为例,介绍内核的Oops机制,我们使用grep搜索一下内核中可能会报Oops的地方:./arch/arm64/kernel/sys_compat.c:142: arm64_notify_die("Oops - bad compat syscall(2)", regs, &info, scno);./arch/arm64/kernel/traps.c:771: die("...

2019-12-09 20:24:13 2986

原创 Linux kernel panic代码解释

当Linux内核发生严重错误的时候,系统无法继续运行下去,此时内核会主动触发一个panic操作,它的执行流程分析过程如下所示:kernel/panic.c:void panic(const char *fmt, ...){ pr_emerg("Kernel panic - not syncing: %s\n", buf); ... if (panic_tim...

2019-12-04 14:54:09 4180

原创 gcc支持的C语言标准(-std选项)

gcc支持多种版本的C标准,比如C90(ISO1990)、C99(ISO 1999)和C11(ISO2011),除此之外,GCC还会支持一些GCC特有的扩展。分别是:gnu89/gnu90: ISO C90 + GCC extensiongnu99: ISO C99 + GCC extensiongnu11: ISO C11 + GCC extension支持的C语言标准可以使用-s...

2019-07-15 15:11:32 11982

原创 ftrace在实际问题中的应用

我在自己的其他博文中有介绍ftrace的介绍和使用方法,那么在实际的工作中,ftrace可以用来做什么呢?在实际问题场景中ftrace主要用来跟踪延时和调用流程,分析性能问题。function/function_graph 分析内核函数调用流程function/function_graph是利用的GCC的编译选项来完成对函数的插桩的,ftrace自带的function tracer和fun...

2019-07-08 18:12:27 2540

原创 多核编程与CPU亲和力

多核编程多核编程和多线程编程还是有一些差异的,对于多线程编程,我们可以创建多个线程去处理业务,但是不会关心具体哪个进程运行在哪个CPU上,而多核的意思则是可以把特定任务绑定到特定的CPU上运行。这样的好处是什么?能够把重要的任务独立到一个CPU上运行,从而不受其他任务影响,提升该任务的响应速度。通过CPU绑定也能提升cache命中率,从而提高性能。具体到使用上,就是利用如下API绑定CPU:i...

2019-05-30 19:10:21 1511

linux gtk hello test

gtk hello world,test for gtk lib

2016-01-14

linux v4l2 camera config

linux v4l2 camera config

2016-01-14

v4l2 camera capture and config

linux系统下的camera capture和camera config实例

2015-08-17

linux v4l2 camera capture

v4l2接口,camera capture实例,合法合规!

2003-07-28

空空如也

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

TA关注的人

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