自定义博客皮肤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的日常干货

学而不思则罔,思而不学则殆! (xiehaocheng127@163.com)

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

原创 CPU负载均衡

如何实现负载均衡为了系统负载的均衡,主要通过如下三种手段:(1)当一个进程要加入runqueue时,选择负载最轻的cpu上的runqueue(2)当前CPU的runqueue为空时,主动拉取其他runqueue上的进程来运行(3)周期计算各个CPU上的负载情况,在必要的时候迁移进程具体的场景,CFS调度器负载均衡发生在如下的一些路径上:1.当前进程离开runqueue,进入睡眠,而对应...

2019-02-28 19:37:36 4889

原创 内核调度时机

调度的时机内核中常见的调度场景如下:(1)进程被阻塞时,比如执行sleep()后,需要立刻执行schedule()进行调度(2)当唤醒进程时,比如try_to_wake_up()执行时,会重新计算负载,查找需要执行的进程,并设置TIF_NEED_RESCHED标志延时调度(3)当周期执行的scheduler_tick()发现需要切换进程时,设置TIF_NEED_RESCHED标志延时调度...

2019-02-19 10:19:19 727

原创 centos中vmcore的生成过程窥探以及优化

vmcore生成的机制对于centos系统,如果要配置机器宕机后自动生成vmcore,应该很多人知道,需要借助于kdump服务。因此想要了解系统如何生成vmcore的,就需要从这个服务开始,首先直接查看一下该服务的运行状态:systemctl status kdump● kdump.service - Crash recovery kernel arming Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendo

2022-03-24 12:13:30 3159

原创 dhcp client的加快配置的方法

修改dhclient.conf中的超时时间:timeout 60;retry 10;backoff-cutoff 20;initial-interval 5;reboot 10;

2021-12-02 15:09:11 1716

原创 使用atop和perf分析抖动问题的方法

抖动问题一般都是发生在一瞬间,可能下一秒就已经不存在了。那么对于这类问题要如何定位呢?首先还是要能收集到发生问题的瞬间,相关的系统信息。atop对于一个问题, 先从宏观的角度来寻找问题的方向,我们可以通过安装一个atop,配置为1s粒度记录系统信息,这样当抖动发生时,可以回溯系统监控信息,从宏观角度看一下可能存在问题的是哪一个模块,比如可能是io,mem还是network等等。yum -y install atop安装完成后,配置采样频率为1秒:cat /etc/sysconfig/atop

2021-07-15 12:11:20 1585 1

原创 ext4文件系统数据恢复的方法总结

对于一个文件系统来说,物理盘上保存的信息包括两类,一个是原数据信息,存在于inode中,另一个是实际数据块,inode中还保存有指向数据块的相关信息,这样一个文件只要找到inode,就可以索引到对应的数据块了。实际工作中,可能会遇到不同类型的数据丢失问题,比如:对于一个文件的写入操作没有落盘机器异常关机了,导致数据丢失这种情况,如果打开了ext文件系统的journal日志功能,那么对应的写入数据,还有一定可能会保存在journal日志中,那么那可以利用这其中的信息来进行恢复操作。一个文件被误

2021-05-19 22:22:56 6701

原创 IO通用块层中的block

sector硬盘的最小存储单位就是扇区了,而且硬盘本身并没有block的概念。block文件系统不是一个扇区一个扇区的来读数据,太慢了,所以有了block(块)的概念,它是一个块一个块的读取的,block才是文件存取的最小单位。块是文件系统中的概念:对于ext4来说一个block是4K,也就是说我所使用的文件系统中1个块是由连续的8个扇区组成。tune2fs -l /dev/sda3 | grep "Block size"Block size: 4096简单的说扇

2021-05-19 17:20:26 847

原创 ext4文件系统布局

ext4文件系统块组ext4中的数据是按照块组进行管理的,一个块组来中包含有多个块。其中有1个块用于保存数据块位图,因此位图中包含有多少个bit就决定了块组中块的个数。比如,对于一个块大小为4096Byte的设备,块位图中的比特位数为32768(4096 * 8),那么单个块组中最大就只能具有32768(4096 * 8)个块。那么也可以计算出单个块组的大小为32768*4096=128MB。块组的结构布局如下所示:超级块ext4超级块(super block)记录了文件系统的很多关键信息,如果

2021-05-19 17:16:07 1098

原创 内核中读写信号量(rwsem)实现的关键注释

读锁实现注释:struct rw_semaphore __sched *rwsem_down_read_failed(struct rw_semaphore *sem){ //1.默认是减去这个值,在运行到这里之前,会先try,在try时增加了read标记,但是获取锁失败了,所以要undo这个操作 long count, adjustment = -RWSEM_ACTIVE_READ_BIAS; struct rwsem_waiter waiter; struct tas

2021-05-18 16:10:08 1337

原创 crash中使用list遍历结构体

list [[-o] offset][-e end][-[s|S] struct[.member[,member] [-l offset]] -[x|d]] [-r|-h|-H] start如下介绍只列举常用的和容易混淆的参数:[-o] offset:用于指定next地址指针,可以不用加-o,它支持两种offset格式,一种为structure.member,另一种为一个数字当使用这个offset参数后,最后跟的start地址应该是这个结构体地址,而不是list_head地址。-s struct:

2021-05-17 21:38:59 1977

原创 如何理解进程结构体中的mm和active_mm?

结构体task_struct里面有一个mm成员,和一个active_mm成员。其中mm成员主要是用来区分是用户进程还是内核进程的,对于内核进程来说,mm成员是为NULL空的。进程地址空间的创建当一个进程被创建时会复制对应的mm成员的值为父进程的值,这样子进程就复用了父进程的地址空间。地址空间的切换在进行地址空间切换时,内核是使用active_mm来进行切换的:1 对于一个mm不为NULL的用户进程来说,active_mm = mm2 对于一个mm为NULL的内核线程来说,active_mm

2021-05-17 17:48:48 902

原创 第一个eBPF程序.md

背景了解bpf的童鞋都应该知道,bpf程序是可以attach到不同的probe点上来做内核级别的trace,那么对于刚入门的人来说,如何来编写一个初级的bpf程序呢?这就是本篇博文想要介绍的内容。bpf程序的组成BPF程序我们知道它需要先使用LLVM进行编译,完成后加载到内核中去执行,那么对于一个完成的BPF程序来说,它应该包含有两部分:第一部分是用户态程序,它的作用是用来加载编译完成的内核BPF字节码文件,并且与内核态程序进行交互,一般是获取profiling数据。第二部分是内核态BPF程序,

2021-03-09 16:51:22 1045

原创 centos8系统中bcc安装

命令安装yum -y install bccyum -y install bcc-toolsyum -y install python3-bccyum -y install bcc-devel此时会安装bcc基础库和对应bcc tools,然而我们想要直接运行对应的bcc-tools,比如execsnoop却发现并未找到对应的可执行文件。查看下bcc-tools工具的安装目录:rpm -ql bcc-tools发现该工具的安装目录在/usr/share/bcc/tools/ 这里。这个目录

2021-03-09 11:22:51 2203 3

原创 virtulbox 虚拟机中Linux系统如何安装扩展插件

virtualbox的扩展插件是分为宿主机和虚拟机两部分的。宿主机对于宿主机来说,就是需要在virtualbox软件中添加扩展包,名字类似Oracle_VM_VirtualBox_Extension_Pack-4.0.10.vbox-extpack虚拟机而对于虚拟机而言,如果虚拟机是window系统,那么当宿主机安装了扩展包后,虚拟机会自动下载并安装对应的子机插件。而对于Linux系统,则需要安装VBoxGuestAdditions_4.0.10.iso 插件。首先需要在官网找到对应版本的virt

2021-03-05 21:35:06 1160 1

原创 使用nc收发数据

发送端:echo “Hello world” | nc -u 127.0.0.1 7777使用udp协议发送到端口7777接收端:nc -ulp 127.0.0.1 7777从7777端口接收udp协议包

2021-01-08 17:51:50 1944

原创 如何区分tty和tty0和console设备

/dev/tty设备这个设备表示的是控制终端,如果当前的shell登录环境有关联控制终端,那么执行它就可以看到回显。echo test > /dev/tty它其实是一个当前控制终端的一个别名,实际控制终端可以是伪终端(/dev/pts/x),也可以是虚拟控制台(/dev/ttyx)。/dev/tty有些类似于到实际所使用终端设备的一个链接/dev/tty0设备tty0表示的是当前虚拟控制台的一个别名,而实际的虚拟控制台是tty1…ttyn。其中tty1和tty2为X窗口系统,其余为虚拟字符

2021-01-07 22:04:27 2766

原创 crash中如何查看gs寄存器中的值

gs寄存器在x86平台上主要用于记录per cpu变量的base address,我们可以使用kmem -o命令来查看这个基地址:crash> kmem -oPER-CPU OFFSET VALUES: CPU 0: ffff88013e800000 CPU 1: ffff8820f0c00000 CPU 2: ffff88013e820000 CPU 3: ffff8820f0c20000 CPU 4: ffff88013e840000 CPU 5: ffff8820f0

2021-01-06 16:46:03 1034

原创 汇编test %rax %rax的含义

x86平台上使用汇编如何判断一个值是否为0?一般会使用该指令:test %rax %raxje xxxtest指令会判断后面两个操作数执行AND操作,结果为0就设置zero flag,然后搭配je跳转指令从而实现对一个值是否为0的判断。如果%rax值为0,那么他们相与才会等于0,否则该值不会为0....

2021-01-05 20:02:46 6951

原创 CVM抖动问题分析思路

抖动是一个极其复杂的问题,它涉及到的原因非常多,本文试图理一下排查的思路,可能并不能涵盖所有内容。1.对于虚拟机来说,引起抖动的问题可能发生在虚拟机内部或者发生在宿主机上,那么第一步就是要先找出这个问题机器。比如网络抖动,那么直接就分别在宿主机和虚拟机中进行抓包来找出问题机器,定位到问题机之后再进一步查看。2.针对抖动问题,首先就是要抓到现场的数据,抖动一般都是比较短暂时间出发的行为,因此需要比较细粒度的trace方法常用的有atop、perf record等等3.引起抖动问题的因素有多种,需要一

2021-01-05 11:30:25 441

原创 如何理解perf工具中的-F选项和-c选项

perf -c count和perf -F freq选项都是用来指定采样频率的。对于-c来说,当perf启动后PMU会记录event事件信息,那么当event信息数量超过count时就会采样一次。对于-F来说,它的维度是按照一秒钟内的采样次数来计算,它试图在一秒钟内采样freq次来达到预期采样周期的目的。这两者实际上实现的功能是类似的。参考:https://stackoverflow.com/questions/53449001/linux-perf-record-difference-betwe

2021-01-05 11:08:02 1770

原创 soft lockup问题的定位方法

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

2020-12-31 18:41:38 1882

原创 tapset: 可以复用的内建函数

systemtap支持的内建函数实际上就是通过tapset script实现的一些通用库,可以通过官方文档来查看systemtap内建的一系列函数。https://sourceware.org/systemtap/tapsets/

2020-12-29 11:47:09 210

原创 如何判定一个TCP应答包为dupack?

首先需要明白TCP包中的sequence和ack sequence的含义:1.sequence·是表示发送方的当前包的起始数据序列号2.ack sequence则是表示对接收方的应答序列号,它是指对方下一个包要使用的起始sequence。(上一接收包的sequence加上len之后的值)那么再来看什么是dupack,它是为了快速重传机制而发送的重复确认包,那么是不是说只要发送包中的ack sequence一直相同就表示它是一个dupack呢,并且会触发重传机制?实际上并不是如此,试想一下,当发送方A

2020-12-28 20:47:07 1550

原创 systemtap相关的学习文档

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

2020-12-28 12:06:10 334

原创 使用systemtap进行内核跟踪

如果想要添加一个systemtap内核桩位,但是又不知道该插入到哪里,可以通过如下命令查看systemtap支持的所有的打点位置:stap -L '*.*' 如果想查看这些位置点一共分为哪些类别,可以对输出记过做一下归纳处理: stap -L '*.*' > list.txtawk -F '.' '{print $1}' list.txt | uniq -c | sort -rn...

2020-12-28 11:50:48 1206

原创 如何理解ifconfig中的errors/dropped/fifo/frame统计指标

对于ifconfig来说,它所获取一些错误统计信息如下所示:RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0首先这些指标获取是从/proc/net/dev:cat /proc/net/devInter-| Receive

2020-12-10 17:17:33 14459 1

原创 protobuf和protobuf-c什么区别

获取源码:protobuf版本地址:https://github.com/protocolbuffers/protobuf/releasesprotobuf-c版本地址:https://github.com/protobuf-c/protobuf-c/releases编译安装protobuf:./autogen.sh./configuremake -j4 && make install编译安装protobuf-c:export PKG_CONFIG_PATH=/usr/lo

2020-12-08 17:57:24 1813 1

原创 NUMA架构对于程序设计的影响

NUMA指的是非一致性访问模型,现在越来越多的大型计算机统中采用了NUMA架构的设计,主要是它的扩展性好,也可以降低成本,同一个机位可以存放一个更多核心和更多内存的机器,自然可以降低IDC的建设成本。对于一个NUMA系统来说,CPU是属于不同的节点node的,内存也是属于不同的node,那么在访问内存时如果是相同node下的CPU和内存之间的访问,那么速度很快,而如果是跨越了node去访问内存,那么速度就会明显变慢。这就带来一个问题,很多应用开发者对于硬件架构的了解并不是很多,如果一个应用进程在申请内存时

2020-12-03 11:31:20 477

原创 linux进程切换与intel的tss任务切换

本文作者主要想聊聊linux进程切换是如何与intel的tss配合工作的。最近工作中遇到一些问题,引发了我的一些思考,我在看到进程切换做寄存器上下文保存和切换时,涉及到了tss的操作,而我是一头雾水,进而引发了强烈的好奇心,想要探究一下到底是怎么回事。经过网络检索以及内核代码的学习,总算有一些眉目了。首先需要搞懂什么是tss? 它全称叫做task status segment。简单来讲,可以把它理解为是一块内存段,用来保存任务的寄存器信息的,主要用于任务切换时做寄存器的上下文切换,这块内存具有固定的格

2020-12-03 00:47:53 1545

原创 ftrace stack trace

内核栈大小是有限的,为了跟踪内核栈的使用情况,可以使用ftrace stack trace。使能和关闭方法:echo 1 > /proc/sys/kernel/stack_tracer_enabledecho 0 > /proc/sys/kernel/stack_tracer_enabledstack trace的信息输出通过如下的节点上送给用户态:/sys/kernel/debug/tracing/stack_max_size/sys/kernel/debug/tracing

2020-11-26 11:55:08 1408

原创 Linux hugepage如何配置和使用

为什么要使用hugepagehugepage也就是所谓的大页,为什么要使用它,自然是有它的一些优势,比如它所占用的page table entry较少,从而提高了页面查找的效率,tlb命中率也更高。另外hugepage相当于是预留了一块内存给特定用途使用,是不受系统内存管理子系统的影响,不能被swap出去,从而使用它的性能也就更佳。cmdline预留内存hugepage是预留的一部分内存用于大页面使用 ,hugepagesz=2M hugepages=2048动态预留内存/sys/kerne

2020-11-24 22:18:11 5857

原创 如何理解内存管理中的alloc_flags?

首先需要明确一点alloc_flags和gfp_mask之间的区别,gfp_mask是使用alloc_pages申请内存时所传递的申请标记,而alloc_flags是在内存管理子系统内部使用的另一个标记,二者是不同的,当然alloc_flags也是从gfp_mask经过计算得到的。关于alloc_flags的定义有如下几个:/* The ALLOC_WMARK bits are used as an index to zone->watermark */#define ALLOC_WMARK_M

2020-11-12 17:14:43 939

原创 内存申请标记注意区分___GFP_HIGH和___GFP_HIGHMEM

背景经常在看内存管理这块的代码时会看到这两个标记,有时候稍微不注意就会把他们搞混了,本篇博客就来聊聊他们的区别。定义首先这两个标记的定义如下,由此可见他们两个是不同的两个标记,表示的当然也是不同的意义:#define ___GFP_HIGH 0x20u#define ___GFP_HIGHMEM 0x02u对于___GFP_HIGHMEM 标记来说,它是用来在内存申请时确定要从哪个目标zone中申请内存的。具体可以参考我的博文:《如何从GFP确定最后申请的内存来自

2020-11-12 17:01:18 1504

原创 __alloc_pages_nodemask是如何申请内存的?

本文基于linux3.10Fast path:get_page_from_freelist – First allocation attemptusing low watermark:gfp_mask |= __GFP_HARDWALL;alloc_flags = ALLOC_WMARK_LOW|ALLOC_CPUSET|ALLOC_FAIR;第一次尝试申请空闲内存,使用LOW水位判断是否足够申请。get_page_from_freelist – retryusing low waterm

2020-11-12 16:39:39 930

原创 如何从GFP确定最后申请的内存来自哪个zone?

申请内存时需要先确定两个值,分别是high_zoneidx和migratetype。这两个值从哪里获取到呢?都是利用上面传递过来的GFP flag。对于high_zoneidx是通过gfp_zone函数获取的,而migratetype是通过gfpflags_to_migratetype来获取的。其中gfp_zone是利用的GFP标志位的bit[0-3]这4个bits来确定的,而migratetype是bit[3-4]这两个bits。需要注意他们中间是存在重复的__GFP_MOVABLE标志的,说明它不仅仅

2020-11-12 11:04:37 831

原创 centos和ubuntu分别如何配置dhcp网络

centos默认启动网卡未使能/etc/sysconfig/network-scripts/ifcfg-enp0s3BOOTPROTO=dhcpONBOOT=yesubuntu server默认网卡未使能,如何配置网络/etc/network/interfaces:auto enp0s3iface enp0s3 inet dhcp/etc/init.d/networking restartubuntu18.04 server,启用了新的网络工具netplan:/etc/netplan

2020-11-05 11:39:22 236

原创 grep搜索特定文件

搜索当前目录中的C文件,查找main关键字。find . -name "*.c" | xargs grep main需要区分开xargs和单纯使用管道的区别,单独使用管道|,是把上一个命令的标准输出作为后一个命令的标准输入;而使用xargs则会把上一个命令的标准输出作为后一个命令的标准命令。比如上面的命令如果不加xargs来传参,那么搜索的含义将发生变化:find . -name "*.c" | grep main这条命令表示的是搜索当前目录中的所有c文件,并且查找文件名中包含有main关键

2020-11-05 10:55:41 5232

原创 新安装Linux系统配置网络(centos/ubuntu)

centos安装完了centos新系统之后,发现网络不通,实际上是并没有使能和配置网卡,通过修改在如下位置的配置文件:网卡配置:/etc/sysconfig/network-scripts/ifcfg-enp0s3自启动网卡:使能自启动网卡选项:ONBOOT=yes自动获取IP:需要使能dhcp服务自动获取IP,自启动网卡选项:BOOTPROTO=dhcpONBOOT=yes静态配置IP:配置ip、netmask、gateway:IPADDR='192.168.1.10'NET

2020-10-17 15:17:46 926

原创 python判断ip是否在子网内的两种方法

方法1:import IPydef in_subnet(ip, subnet): if ip in IPy.IP(subnet): return True else: return False方法2:def in_subnet(ip, subnet): match = re.match("(.*)/(.*)", subnet) if not match: return False sub

2020-09-29 10:44:35 1696

原创 python获取本机默认网关

方法1def get_gateway(): cmd = "ip route | grep default | awk '{print $3}'" try: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) p.wait() results = p.stdout.readlines() if len(resu

2020-09-28 15:29:03 1927

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关注的人

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