
Linux
文章平均质量分 82
DeepClick
分享ClickHouse技术解决方案和最佳实践。
展开
-
内存泄漏专题(7)hook之宏定义
在此之前,我们封装一个链表,用来存储每次申请内存的地址以及申请内存的大小,在每次申请内存的时候,向链表添加一条数据,每次释放的时候,将对应的记录删除掉,那么,当程序结束,如果链表还有数据,那就是没有释放的泄露部分的内存。我们注意在第1行包含了头文件,并在第4行和14行分别调用了mcheck的接口,这样的话,就可以检测出这个过程中出现的内存泄露问题,以上代码运行会产生一个名为。它告诉我们第6,11,13行分别出现了内存泄露,大小是多少,调用的那么函数申请的内存,还是比较详细的。函数时,先调用我们自己定义的。原创 2023-07-26 15:29:53 · 564 阅读 · 0 评论 -
内存泄露专题(5)动态内存追踪大杀器:bcc
eBPF这几年网上炒得很热,甚至于有许多开发者十分迷信该技术,虽然eBPF的确能解决不少问题,但这种技术是否能真正用于生产环境,其实是需要根据场景而异的。这里就不做过多的篇幅来讲述eBPF的概念了,感兴趣的可以上网自己查找相关资料。bcc是一个eBPF的工具集,使用C/C++实现,外层使用python进行封装。由于eBPF需要以上才能够支持,因此,如果你的服务器是CentOS7或者比较低版本的Ubuntu,都是无法使用该工具的。笔者所使用的的服务器是CentOS7.9,内核版本为3.10.0。原创 2023-06-28 08:05:31 · 1246 阅读 · 0 评论 -
内存泄露专题(4)mtrace内存追踪
等内存申请释放的调用处,插入自己的一些代码,用来记录内存的信息,包括指针的地址,内存块的大小等。的内存信息,其中包含有内存申请的地址,内存申请的大小,释放内存的地址,释放内存的大小。内存并没有释放,所以这段程序是会内存泄漏的。行,它告诉我们下面这些内存是没有被释放的,其次可以看到从第。系统内核自带的一个内存追踪的函数,它会在每个内存申请函数。工具集中的一个,所以如果系统没有该命令的话,可以使用。的位置记录下信息,并在每个内存释放的位置记录下。函数取消内存使用记录。大小的内存没有被释放,这个大小,转成。原创 2023-06-28 08:03:40 · 2510 阅读 · 0 评论 -
内存泄漏专题(3)内存泄漏调试神器valgrind
追踪内存泄漏的工具有很多,网上一搜能找到一大片,但针对不同的系统,均有不同的玩法,且有些东西,如果不是实际实战一把,真到了用的时候,仍然会眼高手低,不知如何下手。上一章中,我们提出了排查内存泄漏是否存在的几种思路,但只是停留在理论上,本章就这几种思路提供具体的解决方案。在本章节,将以具体的例子的方式来演示如何定位内存泄漏的具体位置。的初学者对该工具都不陌生,很多内存检测的入门教程都会提到该工具。对于内存泄漏的定位还是非常准确的,因此不失为一个内存泄漏调试的好手段。行则报告了内存泄漏的信息,说有一次。原创 2023-06-28 07:59:57 · 609 阅读 · 0 评论 -
内存泄漏专题(2)如何判断程序有内存泄露
当内存池化之后,由于对于内存的申请和销毁都是先由内存池初始化时向系统申请一块内存,在程序结束时销毁该内存池,中间所有关于内存的操作都是针对池子而言的,因此不太容易出现内存泄漏。如果某个程序是长期运行的,那么可能申请的内存一直存在于池子中,不会得到销毁,定长内存池相对好一点 ,特别是对于非定长的内存池,如果在程序中一味地从池子中申请内存,但并没有在适当的地方及时归还给池子,同样会造成内存越用越大,导致系统内存耗尽。这时候,我们可能要借助一些其他的调试手段或者第三方工具,来判断是否有内存泄漏,比如著名的。原创 2023-06-28 07:57:32 · 496 阅读 · 0 评论 -
内存泄露专题(1)何为内存泄露
只有对那些占用内存比较小的变量,对执行效率要求比较高的地方,可能直接使用栈上的内容,对于一些比较占用内存的结构,比如结构体、字符串等,通常的做法,都是在堆上申请内存。所谓内存泄漏,就是由于程序主动申请了内存,但是又没有主动释放它,那么这块内存可能就会一直驻留在进程中,只要进程不结束,内存就一直不释放。类的守护进程,一旦发生内存泄漏,那么后果是不可设想,因为在长时间的运行过程中,进程一点点蚕食系统内存,最终可能导致系统内存耗尽,从而导致系统崩溃。诞生的那一天起,内存和指针就好比天上的两朵乌云,笼罩在无数。原创 2023-06-28 07:53:52 · 201 阅读 · 0 评论 -
C语言获取服务器MAC地址
在Linux系统,可以通过系统调用函数ioctl很容易就获取到服务器的mac地址。它的信息保存在结构体中,有可能不止一个。获取到的信息保存在ifc_buf中。通过上面简单的两步,就能获取到Linux服务器上所有的网卡对应的mac地址。可见,取出来的mac地址是正确的。原创 2023-06-25 07:45:17 · 1245 阅读 · 0 评论 -
C语言柔性数组
所谓柔性数组,是C语言中的一个概念,也叫零长数组。顾名思义,这个数组的长度是不固定的,当没有值时,它的sizeof长度为0。上面的结构体中的char buf[]就是一个柔型数组。那么,怎样才算满足一个柔型数组的定义呢?原创 2023-06-15 09:21:13 · 1106 阅读 · 0 评论 -
C语言获取Linux单网卡的多IP地址
上一篇文章主要讲了AIX系统下的单网卡多IP的IP的配置以及C语言获取的方法。相比AIX,Linux下配置就方便得多。首先找到我们需要配置的网卡名,比如p2p2, 进入到目录,找到ifcgf-p2p2如上图,我们增加了两个IP, 一个为,一个为。完成后,从ifcofig但是用ip a。原创 2023-05-31 13:46:07 · 1313 阅读 · 0 评论 -
C语言获取AIX单网卡的多IP地址
在AIX上,可以使用命令给单个网卡配置多个IP别名。en1IPNETMASKF10查看网卡信息,已经配置完成。原创 2023-05-30 18:46:33 · 1101 阅读 · 0 评论 -
clickhouse的BACKUP/RESTORE命令介绍
无论是备份还是恢复,执行效率都非常高同压缩比备份,支持不同的备份目的地支持增量备份需要开放配置,操作性上不太友好集群备份到本地时,必须要选共享目录,如果每个分片单独备份,则无法进行数据汇总,存留于节点自身,与没有备份没什么区别,还不如多加副本数据恢复功能尚不太完备推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,原创 2023-05-29 10:44:08 · 3909 阅读 · 4 评论 -
docker 解析DNS失败
我之前在docker里部署的容器,今天突然访问不了了,一开始我以为是容器的问题,将容器restart,销毁重建,都没有解决。里面报大量的DNS解析错误。是没有问题的。原创 2023-05-29 10:15:38 · 3153 阅读 · 0 评论 -
SUSE系统修改静态IP
Suse系统使用yast管理配置,默认创建虚拟机,是使用DHCP获取动态IP的,这样非常不利于管理。因此,最好使用静态IP。推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,键切换到需要修改的位置,直接向后删除修改即可。修改完成后,立即生效,不需要重启网络,且机器。, 否则后面的修改会不生效。下面可以填写一些国内比较快的。原创 2023-05-23 08:21:19 · 3152 阅读 · 0 评论 -
性能媲美epoll的io_uring
io_uring通过队列将send和recv的数据做到异步解耦,从而提升了性能,但是相比于epollio_uring过分依赖于内核版本(kerner5.10以上),且操作相对比较繁琐。因此,现阶段可以作为了解,主流使用应该还是以epoll为主。C/C++Linux服务器开发/高级架构师。原创 2023-05-23 07:51:42 · 782 阅读 · 0 评论 -
实战TCP三次握手
在几乎所有的后端开发面试题中,TCP三次握手绝对是最被面试官青睐的题目之一。但是这个东西,平时开发中看不见,摸不着,对于很多人来说,是纯理论的知识,玄之又玄。但是为了应对面试,又不得不去死记硬背。就……真的是硬背。我之前面试过一个小哥,问了一嘴三次握手,这小哥掰着手指头搁那背,ACK和SEQ都搞反了,我问他SYN标志代表什么意思,也说不大清楚。所以是不是真的搞懂了,一问便知。原创 2023-05-20 07:49:02 · 2173 阅读 · 1 评论 -
7种常见网络并发模型介绍
对于网络服务器后端开发,为满足不同并发场景的需要,一般来说,不外乎几种常见的并发模型,除了一些教学场景常用的单线程、多进程(线程)的服务器实现外,生产用的服务器,一般都会考虑使用IO多路复用模型。而常见的IO多路复用场景 ,可以设计得很简单,也可以设计得比较复杂,一般根据业务需要而定。本文总结了一些比较常见的服务器并发模型,基本涵盖了 大部分业务场景。在实际业务开发的技术选型时,可根据场景,选取一款稳定、可靠的网络模型,还是十分关键的。原创 2023-05-08 07:42:53 · 1858 阅读 · 0 评论 -
C语言静态编译和动态编译
概述在Linux系统中,应用程序表现为两种文件,一种是可执行文件, 另一种是脚本文件。可执行文件可执行文件是计算机可以直接执行的程序,与windows系统的.exe程序相似,它是由源代码经过一定的手段翻译成计算机能够读懂的二进制编码,由计算机直接去执行,这个翻译的过程就称之为编译。脚本文件脚本文件是一系列指令的组合,由另一个解释器来执行,相当于windows系统的.bat文件。与win...原创 2018-11-12 00:51:25 · 14572 阅读 · 1 评论