自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

追寻梦想的青春

那些年我们心中都曾怀揣着梦想

  • 博客(143)
  • 资源 (1)
  • 收藏
  • 关注

原创 专栏文章列表

C++和Linux相关内容

2023-10-06 22:17:33 506

原创 【kubernetes】专栏目录

kubernetes系列文章目录

2023-10-02 21:41:55 218

原创 【kubernetes】k8s中的选主机制

如果有人认为,传统应用需要部署多个通常是为了容灾,而在k8s上运行的Pod受控制器管理,如果Pod异常或者Pod所在宿主机宕机,Pod是可以漂移到其他节点的,所以,不需要部署多个Pod,只需要部署一个Pod就行。leader-election的具体工作方式是:各候选者将自身的信息写入某一个资源,如果写成功,某个后选择就称为了主,其他就是备,同时,在之后主会定期更新资源的时间,如果超过一段时间未更新时间,其他候选者发现资源的最后更新时间超过一定值,就会认为主挂掉,然后会向资源写入自身信息,从而成为新的主。

2023-09-25 23:43:19 8523 1

原创 基于Flink的实时告警实现(3):时间窗口

本专题将会从0到1实现告警处理流程,并会讲解实现过程中使用到的Flink中的技术。1 告警需求前面的(1)和(2)简单的介绍了flink、开发环境的搭建以及读取kafka的数据并对数据进行转换以便后续处理,现在就可以开始真正的实现告警了。先简单说下需求:该需求的主要目的是对网络交换机进行监控,快速发现网络的问题。采集器接收到网络交换机的指标数据,例如错包等,将这些指标存入到kafka中,然后再从kafka中读取数据并写入到后端的持久化存储。这里需要添加告警功能,常规的方法可能是另外写一个程序,通过.

2021-05-06 19:53:28 2321

原创 基于prometheus的网络指标监控

1 网络指标监控 网络设备(交换机、路由器、防火墙)本身并没有太多的监控方式,常规的是使用snmp,通过oid去采集网络设备的指标,例如,流量或者错包,不过近年来也出现了新的采集方式,例如,telemetry或者gnmi,不过这种方式通常都需要对接接口,并且较新的设备才支持。 prometheus本身提供snmp的exporter,在项目初期人力不足的情况下,可以直接部署prometheus,只要将要采集的设备列表放到配置文件,然后配置好告警规则就可以完成初步的网络指标监控。2 pr...

2021-03-09 23:16:33 5658

原创 [STL源码剖析] 自增和自减运算符的重载

在运算符重载中,自增和自减运算符的重载因为其操作数的问题而呈现出与其它运算符重载不一样的特性。

2014-01-07 15:16:00 1635

原创 [C++ Primer] 第十五章的句柄类

为什么要使用句柄呢?句柄可以用来管理指针,以句柄代表的语义可以将句柄分为:指针型句柄和值型句柄。

2013-12-09 20:54:38 1152

原创 那些年我们一起追寻过的考研(华科计算机)

——痛并快乐着我的基本情况:    我是武汉市的一名应届本科生,参加了2012年的考研,报考华中科技大学计算机学院。    初试成绩:政治:61分 英语:63分 数学:138分 专业课:124分 总分:386分我的考研经历:    高考失利,让我只能在一所非211的高校就读,很早就下定决心要考研了。我是大三下学期开始准备的,大三寒假一来,早上记记单词,平时有时间的话看看高数的教

2012-04-26 10:22:52 7328 1

原创 eBPF编程指南(二):CO-RE

生成精简的BTF文件,内核有很多数据结构和函数,但是我们的BPF程序通常只使用很少一部分,因此,可以通过BPF的内核态程序结合BTF文件生成精简的必须的BTF文件,文件大小相隔1万倍,同时,虽然内核在变化,但是可能我们的BPF程序使用的这部分很少变化,所以,可能某个发型版本的大版本生成的精简的BTF文件是一模一样的,这无形中也减少了BTF文件的个数,通过这两种方式,整个BTFHub仓库的BTF文件大小可以降到几MB,完全可以打包在客户端程序中进行分发。

2024-09-05 15:38:35 1000

原创 kubernetes排障:kubelet cgroup driver: “systemd“ is different from docker cgroup driver: “cgroupfs“

在容器环境下,有两种使用cgroup的方式:一种是直接操作cgroup在操作系统上的文件,另一种是通过一层代理的方式间接使用cgroup,这两种方式就分别对应了cgroup driver中的cgroupfs和systemd。在k8s的组件中,kubelet负责与容器运行时交互,因此,cgroup driver的配置就在kubelet的配置yaml中。容器运行时和k8s都可以设置cgroup driver,并且两者的配置必须一致,否则就会报上述的错误信息。目录中指定这一组进程的pid以及资源的使用上限。

2024-08-27 11:15:11 400

原创 systemd-journald日志服务:systemd-journald-audit.socket

systemd-journald的作用是收集系统启动阶段的日志以及服务在启动和运行中的日志,因此,如果服务是用systemd管理的,打印到标准输出的信息就会作为日志被systemd-journal获取到。前面systemd-journald的配置可以看出,日志在保存时可以保存在内存,也可以保存在磁盘,保存在内存中的日志,当机器重启就没了,但是性能会比较好,保存在磁盘中的日志,重启还在,但是性能会差一些。为了提高日志存储的效率,日志保存的格式肯定会采用二进制的方式,因此,无法直接打开日志文件查看,需要使用。

2024-08-26 18:31:19 1388

原创 eBPF编程指南(一):eBPF初体验

EBPF是一种可以让程序员在内核态执行自己的程序的机制,但是,为了安全起见,无法像内核模块一样随意调用内核的函数,只能调用一些bpf提前定义好的函数。为了让内核执行程序员自己的代码,需要指定HOOK点,相当于当内核执行到某个地方时就会执行程序员的代码,这有点类似于ftrace。内核态代码:编译为.o文件,在内核态执行,将数据发送到队列用户态代码:将内核态代码的.o文件加载到内核,接收队列中的数据并分析。

2024-08-09 17:38:02 1353 1

原创 【容器】【Linux】CentOS 9使用Docker镜像实现交叉编译

之后就可以拉取镜像了,由于一些原因,无法从DockerHub拉取镜像,此时通常有两种办法,一种是找国内对应的镜像仓库,另一种方式是找代理。,之后就可以基于上述镜像去编译自己的程序。与x86的主要区别是基础镜像要用。

2024-07-18 11:56:40 545 1

原创 【Linux】Linux中DNS配置文件/etc/resolv.conf详解

当然也跟服务的FQDN格式有关,可以看到如果用全的FQDN格式,其中就有4个点号,而且,根据服务名的规范,服务名中是不能包含点号的,因此,服务的FQDN中只有4个点号。这里提到一个重要的配置项:ndots,该配置项会作为是否需要优先与search配置的域名后缀拼接还是直接查询域名的判断依据,也就是说,如果域名中的点号超过ndots,说明域名足够长,大概率是全域名,直接查询该域名,如果域名中的点号小于ndots,说明该域名比较短,大概率需要与域名后缀拼接。,会直接报错查询不到;

2024-06-26 12:08:22 6448 1

原创 【安全】使用Fanotify拦截文件操作

前文已经说过,Fanotify相比Inotify,比较大的优势是获取的数据多以及Fanotify的阻断能力。阻断能力,顾名思义,就是在用户操作文件时,如果判断出文件是有问题的,可以不让用户操作。

2024-06-21 16:36:38 594

原创 【安全】Linux Fanotify使用入门

fanotify是另一种文件监控机制,在使用上两者类似,都是先调用init函数初始化句柄,然后调用类似watch的函数添加监控路径,再使用select+read的方式读取出变化的事件,根据事件中给出的参数获取文件的路径、事件类型以及其他需要的数据。如果是监控主机上的路径,directed结合FAN_EVENT_ON_CHILD标志就只能监控目录以及目录下的文件,per-mount可以监控pathname所在的挂载点中所有文件或者目录的变化,而global模式可以监控整个文件系统。

2024-06-19 18:06:31 1486

原创 【kubernetes】集群中的DNS配置以及问题定位

CoreDNS查询本地的数据,如果查询到对应的域名则返回,如果查询不到,则查询宿主机的/etc/resolv.conf。当程序需要解析域名时,会通过两个文件进行解析:/etc/hosts和/etc/resolv.conf,其中,/etc/hosts记录的是域名和IP的直接映射关系,/etc/resolv.conf记录的是域名服务器和根域名,会先尝试使用/etc/hosts文件进行解析,解释失败再使用/etc/resolv.conf中的域名服务器查询。首先,在dnsutils的Pod中执行。

2024-06-14 17:10:17 1318

原创 【Linux】使用AddressSanitizer分析内存非法使用问题

AddressSanitizer是进行内存异常使用分析的工具,该工具已经集成到编译器中,因此,只能用于分析C/C++语言的内存问题分析。与Valgrind相比,运行速度更快,但是,从场景来说,AddressSanitizer主要用于检测内存的非法使用,当然也包括内存未正确释放的问题,而Valgrind则可以分析出导致内存增长的调用栈。如果出现内存偏高的问题,可以使用Valgrind工具分析如果出现内存导致的core问题,可以使用gdb的watchpoint或者AddressSanitizer分析。

2024-05-23 17:48:37 1609

原创 【Linux】使用Valgrind定位内存增长问题

Valgrind是Linux上的一套开源的动态分析工具集,通常用来检测和分析程序中的错误,提高程序的稳定性和性能。Valgrind整体架构上包含内核和周边工具集,将程序放到内核模拟的仿真环境中运行,并提供一些能力接口,然后基于这些接口实现周边工具。当程序运行过程中,内存持续增长,一段时间后就可能造成OOM,此时可以使用Valgrind的Massif工具分析程序执行过程中的堆分配内存量。

2024-05-11 16:01:07 1228

原创 【Linux】如何定位客户端程序的问题

不管什么语言开发的程序,都会遇到两类比较棘手的问题:崩溃和性能问题,其中性能问题又可以分为CPU占用高和内存占用高。C/C++需要获取core文件,根据堆栈分析出现问题的代码行,开发环境可以配置core路径,正式环境可以使用Breadpadgolang中可以将GOTRACEBACK设置为crash让程序崩溃时生成core文件(但是,发现用gdb打开时没有程序的符号名,并且core文件很大),也可以在程序退出时利用中的Stack()获取堆栈。

2024-05-09 15:08:31 662

原创 【监控】使用process-exporter监控进程

exporter在基于prometheus的监控系统中属于数据采集模块,每个exporter采集某类数据,由prometheus定时调用exporter接口拉取,因此,如果需要通过prometheus监控某个指标,就需要找到实现这个指标的exporter,或者自己实现exporter。exporter能够采集哪些指标(是否能够采集所需的指标数据)exporter的配置exporter提供的指标可能需要经过计算才能得到所需的指标在实际监控进程时,主要使用的指标就是cpu和内存。

2024-04-09 17:24:32 3360

原创 IDA查看std::string的各种操作

相对C语言来说,C++中增加了很多特性,例如,构造函数、析构函数、异常处理等,因此,从汇编级别的语言看,C++就复杂很多。下面使用IDA工具查看std::string的一些操作背后的实现。以下程序在编译,g++版本为。std::string提供了更高层次的字符串操作,并且提供了很多的方法,与C风格字符串相比,使用起来更加方便,但是,在这些方法的底层,编译器默默做了很多事情。

2024-03-29 11:19:21 1339

原创 使用IDA查看二进制

IDA是一款可以查看二进制的汇编级别代码的工具,并且提供了图形的方式展示程序的执行流程,有时候可以用来定位汇编级别的代码崩溃问题。

2024-03-25 18:05:05 1193

原创 stm32之GPIO寄存器

外部引脚以16位为一组,内部的数据寄存器都是32位,为了对端口进行配置并方便的进行数据的输入输出,在提供基本的输入输出寄存器的同时,还提供了端口配置寄存器和设置/清除寄存器,能够配置寄存器的模式,并且能够方便的操作单个位。从开发编程的角度上看,数据寄存器都是只能整体操作,而不能单个位操作,因此,如果是直接操作数据寄存器的话,就需要先读取再设置,操作起来比较麻烦,有了设置/清除寄存器,可以方便的操作单个位,而不影响其他位。而在C51单片机中,数据寄存器是可以位寻址的,可以直接对某一位进行与或的操作。

2024-03-24 23:34:53 1436

原创 stm32之使用串口下载程序

当从网上购买stm32开发板基础套件时,可能只有USB TO TTL,因此只能使用串口下载方式。使用串口下载方式需要了解stm32的启动配置,也就是BOOT0和BOOT1对应的含义。下载程序之前需要先将CH340的引脚接好,然后在点击复位时,将程序下载到stm32中。

2024-03-21 23:14:25 4855

原创 stm32之GPIO电路介绍

保护二极管:保护引脚,让引脚的电压位于正常的范围施密特触发器:将外部的模拟信号转换为数字信号上/下拉电阻:通过控制开关,可以设置输入引脚的默认电平状态输入数据寄存器:外部引脚电平转换为数字信号后保存到输入数据寄存器,然后由内部处理器读取输出数据寄存器:内部处理器将数据写入输出数据寄存器,然后通过输出控制电路输出到外部引脚位设置/清除寄存器:该寄存器用于修改输出数据寄存器中的某一位的值。

2024-03-19 23:47:02 1581

原创 ANTLR4规则解析生成器(五):错误处理

antlr4在进行语法分析时,如果发现有不符合语法规则的语句时,默认情况下是会打印一行错误信息,通过创建基于的类,可以对错误信息自定义,使得错误信息的可读性更好。

2024-03-11 15:18:04 1411

原创 ANTLR4规则解析生成器(四):优化计算器程序

antlr4默认只会为一条规则生成一个节点处理函数,如果规则的备选分支比较多,在处理该节点时就需要在里面写很多的分支语句,通过为每个备选分支设置标签,可以为每个备选分支生成一个处理函数,在单个处理函数中就可以直接处理Listener适合只需要遍历语法分析树,不需要进行数据交互的场景,例如,语法检查,但是也可以通过创建一个全局的数据结构保存中间结果;Visitor适合可以自定义节点访问的场景,在访问节点时可以返回数据,例如,计算器程序。

2024-03-06 15:49:58 472

原创 python环境搭建(Python 3.11.8)

当开发完成后,需要将我们的程序分发,一种方式是直接给python脚本,这种方式其他人就可以看到你的逻辑,但是对于不想知道你的逻辑,只是想调用的话,就需要安装python的环境,但是大家知道,python的环境跟python的版本和包的版本相关,有时候还比较麻烦,另一种方式是将程序编译为二进制,其他人不关心你的实现逻辑,只想调用的话,这种方式是比较好的。会发现只有默认的pip和setuptools,然后我们就可以自由的在里面进行开发了,也可以使用。的包,在比较新的版本中是可以直接使用内部的模块安装的。

2024-03-01 11:48:31 1193

原创 ANTLR4规则解析生成器(三):遍历语法分析树

定义好词法和语法规则,就可以对提供的输入串进行词法分析和语法分析,得到语法分析树,antlr4提供了Listener和Visitor两种机制遍历语法分析树

2024-02-29 21:06:59 1701

原创 ANTLR4规则解析生成器(二):编写规则文件

本文简单回顾了编译原理中的一些名词解释,然后对sqlite中的sql的g4文件的部分内容进行了解析,大概可以了解到g4文件的编写方式,其实就是用正则表达式描述所有支持的文本结构。

2024-02-20 18:44:37 1190

原创 ANTLR4规则解析生成器(一):入门

ANTLR是ANother Tool for Language Recognition的缩写,它是一个强大的用于读取、处理、执行和翻译结构化文本或二进制文件的语法分析器生成器,广泛用于构建语言、工具和框架,通过语法描述规则,它能够生成一个可以遍历解析树的解析器。ANTLR4是ANTLR的第4个版本。

2024-02-05 19:04:00 3677 4

原创 【kubernetes】集群网络(二):Flannel的VxLan、Host-GW模式

Flannel作为k8s中广泛使用的网络插件,它的实现相对容易理解,它还提供了不同的模式,常用的是VxLan和Host-GW,由于Host-GW要求宿主机在同一个网段,使用受限,因此,最常用的还是VxLan。

2024-02-01 21:40:40 1282

原创 C++多线程编程(四): atomic原子操作

原子操作的意思是该操作执行过程中不能被中断,该操作要么不执行,要么全部执行,不存在执行一部分的情况。在编程语言中,有些操作虽然看起来只有一行,但是变成机器语言后就是多个操作步骤,其中的每个操作步骤都是一个原子操作,但是这些操作合起来却不是原子操作,这样的代码在并发执行时可能会调度到其他线程,从而出现中断的情况,造成数据不一致。原子操作是不能被分割和中断的操作,在多线程并发环境中修改共享数据时,由于数据更新操作不是原子的,会造成数据不一致。

2024-01-21 20:28:05 2453 1

原创 C++多线程编程(三): std::thread线程类

在C++11以前,如果要使用多线程,就需要使用各平台的多线程库,例如,Linux上可以使用pthread,windows上可以使用win32或者MFC提供的多线程API,也就是说,如果要使用多线程,就必须与平台绑定,那么程序就不具备跨平台的能力,为了让程序更好的运行在各平台而不需要用大量的宏来控制编译选项,C++11提供了对多线程的支持,提供了std::thread类。

2024-01-19 18:46:55 565

原创 C++多线程编程(二):条件变量

互斥锁是为了保证多个线程在访问共享资源时不会出现不可预期的结果,能够让多个线程不会同时执行lock和unlock之间的代码,也就是说,互斥锁只是保证在访问共享资源时不会出现问题,但是,有一种场景是需要线程之间进行协作,典型的是生产者-消费者模型:生成者生成数据,放到队列后,通知消费者,消费者接收到信号后,从队列中取出数据进行处理。互斥量是用于解决多个线程同时访问某个资源的并发问题,条件变量是解决多个线程之间进行同步的问题。

2024-01-17 18:58:12 1002

原创 C++多线程编程(一):互斥锁

在现代程序开发中,会大量使用多线程机制,很多语言都内置了对多线程的支持,而C++直到C++11才提供了对多线程的支持,既然支持多线程,那么一定也提供了锁的支持。为什么多线程就一定用锁呢?因为当程序以多线程运行时,如果有对共享资源的使用,例如,两个线程同时对共享变量进行修改,由于这些操作不是原子操作,就会导致出现异常情况,修改的两个线程都认为操作成功了,但是实际上只有一个成功了。这时就需要锁去保证两个操作都分别执行完成。因此,使用锁就需要搞清楚要保护的共享资源。

2024-01-15 18:56:14 1881

原创 【kubernetes】集群网络(一):基础篇

在容器的场景下,一台物理机上面会运行多个容器,于是,就可以结合VxLAN和Bridge,将容器的网络命名空间接入Bridge,同时,将VxLAN接口也绑定到Bridge,容器之间就可以通过VxLAN网络进行通信。Bridge的中文含义是网桥,提到网桥就不得不提到类似的另外3种设备:集线器、交换机、路由器,它们的主要区别是对应的网络层次不一样,能够理解的信息不一样,从而导致转发行为有所不同。前面的路由表是三层的转发信息,当需要跨网络转发时就需要查找路由表,然后将包转发给下一跳。

2023-12-27 00:07:09 362

原创 【安全】audit的一些问题以及需要注意的地方

当内核在执行audit_set_pid时,内核会占用audit_cmd_mutex,然后判断是否已经有其他进程占用audit,如果有就会尝试发送消息,从而判断用户态进程在正常接收审计日志,那么该调用就会返回File exists的报错。因此,在存在该问题的系统上,不能先执行audit_set_pid,然后通过结果判断,而是应该先干掉占用的进程,只在audit_pid为0时才调用audit_set_pid。当用户态程序消费审计日志过慢,造成缓存队列满时,会触发内核的睡眠机制,造成系统卡顿。

2023-12-22 18:45:18 753

原创 【安全】使用auparse解析auditd审计日志

通过auparse就可以快速方便的实现字段的解析和提取,但是需要注意的是,一旦调用auparse_feed将数据给到auparse,auparse会先放到队列,然后进行解析,因此,如果审计日志量级比较大,有可能放到队列的操作会失败,也就是调用auparse_feed失败,如果想增大日志处理的吞吐量,可以创建一个比较大缓存队列,收到日志后,先放到队列,然后再从队列中取出后调用auparse_feed。在序列号后面就是若干字段。

2023-12-21 18:05:05 803

Elastic FileBeat 8.0.0支持http output

官方的FileBeat不支持将数据推送到http output,针对这种场景,对FileBeat进行重新编译,也可以参考https://blog.csdn.net/luofengmacheng/article/details/133622566自己进行编译。

2023-10-13

数据结构考研试题1800题集锦(含答案).CHM

对于要考研的同学,考研下载看看,对数据结构的学习有很大的帮助

2012-10-18

空空如也

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

TA关注的人

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