linux
文章平均质量分 59
香烟头
这个作者很懒,什么都没留下…
展开
-
malloc崩溃
malloc崩溃转载 2023-02-24 17:37:50 · 5120 阅读 · 0 评论 -
gcc添加-fsanitize=address编译选项
内存泄露原创 2022-06-28 09:50:01 · 2807 阅读 · 0 评论 -
Linux动态追踪
目录动态追踪历史 追踪机制说明 常用追踪工具 线上实践指南 总结 参考动态追踪历史严格来讲 Linux 中的动态追踪技术其实是一种高级的调试技术, 可以在内核态和用户态进行深入的分析, 方便开发者或系统管理者便捷快速的定位和处理问题. Linux 在过去十多年的发展中, 演化了很多追踪技术, 不过一直没有一款可以媲美Solaris/FreeBSD系统中的DTrace追踪工具, 直到Linux 4.1+版本eBPF机制的出现, 这种情况才得到了极大的改善. 不过eBPF...转载 2022-03-01 13:40:58 · 595 阅读 · 0 评论 -
查看进程被谁杀
方法1 systemtap:probe begin{ printf("%-8s %-16s %-5s %-16s %6s %-16s\n", "SPID", "SNAME", "RPID", "RNAME", "SIGNUM", "SIGNAME")}probe signal.send{ if (sig_name == @1 && sig_pid == target()) printf("%-8d %-16s %-5d %-16s %-6d ...原创 2022-03-01 10:37:09 · 1527 阅读 · 0 评论 -
Linux内存分析常用工具
原文链接:https://blog.csdn.net/u014023993/article/details/102646882原创 2021-12-02 10:06:05 · 781 阅读 · 0 评论 -
C语言float、double的内存表示
在内存中,小数是以指数形式存在的。float、double 在内存中的形式如下所示:小数在被存储到内存前,首先转换为下面的形式:a × 2n其中 a 为尾数,是二进制形式,且 1 ≤ a < 2;n 为指数,是十进制形式。例如对于 19.625,整数部分的二进制形式为:19 = 1×24+ 0×23+ 0×22+ 1×21+ 1×20= 10011小数部分的二进制形式为:0.625 = 1×2-1+ 0×2-2+ 1×2-3= 101将整数部分和小数部分合并在一...转载 2021-01-28 09:43:05 · 1029 阅读 · 1 评论 -
使用 tc netem 模拟网络异常
在某些情况下,我们需要模拟网络很差的状态来测试软件能够正常工作,比如网络延迟、丢包、乱序、重复等。linux 系统强大的流量控制工具 tc 能很轻松地完成,tc 命令行是iproute2软件包中的软件,可以根据系统版本自行安装。流量控制是个系统而复杂的话题,tc 能做的事情很多,除了本文介绍的还有带宽控制、优先级控制等等,这些功能是通过类似的模块组件实现的,这篇文章介绍的功能主要是通过netem这个组件实现的。netem是Network Emulator的缩写,关于更多功能以及参数的详细解...转载 2020-12-01 10:16:29 · 1072 阅读 · 0 评论 -
Linux 丢包分析
最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,总结出来这篇文章,供更多人参考。在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程。首先网络报文通过物理网线发送到网卡 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA(Direct Memory Access),不需要 CPU 参与 内核从 ring buffer 中读取报文进行处理,执行 IP 和 TCP/UDP 层的逻辑,最后把报文放到应用程序的 socket转载 2020-12-01 10:08:13 · 2356 阅读 · 0 评论 -
uprobe
项目上需要分析用户态程序的性能,开发人员一般的方式是在程序内部实现打点函数,记录当程序运行到该点的时间戳,通过比较两点之间的时间间隔来估计两点之间的时间消耗。这样一方面增加了开发的工作量,另外这些打点也会给业务带来额外性能消耗,是否有另外的方式来解决该问题呢?前段时间在研究ftrace,发现其还有个uprobe特性,故名思意就是用户态的探针工具,今天尝试了下uprobe的使用,小结如下:1.编写小测试程序如下:#include <stdlib.h>#include <s.转载 2020-10-15 15:44:22 · 767 阅读 · 0 评论 -
ASAN
ASAN(Address-Sanitizier)早先是LLVM中的特性,后被加入GCC 4.8,在GCC 4.9后加入对ARM平台的支持。因此GCC 4.8以上版本使用ASAN时不需要安装第三方库,通过在编译时指定编译CFLAGS即可打开开关。1、编译选项1.1 Gcc编译选项# -fsanitize=address:开启内存越界检测# -fsanitize-recover=address:一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行,采用该选项支持内存出错之后程序继续运行转载 2020-06-09 13:43:07 · 2111 阅读 · 0 评论 -
中断和异常——内核的动力
本文内容关注一种内核工作的基本机制——中断和异常。标题称这种机制为内核的动力,或许不那么恰当,主要想强调中断和异常对内核工作的重要性。对于操作系统上层的应用程序开发者而言,或许感觉离中断和异常的机制很远,因为我们不需要开发内核。但是毕竟我们使用的是内核所提供的各种服务,理解内核的基本运作原理能够帮助我们更好地写程序、优化程序。问在前面:通常所说的“陷入内核”,是怎么个陷入法呢? 我们的网...转载 2020-04-21 09:27:32 · 1398 阅读 · 0 评论 -
Linux内核——等待队列浅谈
本文关注内容:Linux内核的一种数据结构:等待队列。在这里,我们不太去关注等待队列细节的实现。主要从功能角度谈下等待队列在内核中的角色。我的观点是,不管是内核,还是内核中的某个组件,理解其角色定位很重要,单纯是从实现细节上去理解某种机制,或许少了点乐趣。你理解阻塞吗?写程序的时候,我们常常说某个系统调用是阻塞调用。从用户层的角度,基本理解是:进程在执行某个系统调用的时候,因为需要的资源...转载 2020-04-21 09:14:26 · 436 阅读 · 0 评论 -
gettimeofday
我们在程序中会频繁地取当前时间,例如处理一个http请求时,两次调用gettimeofday取差值计算出处理该请求消耗了多少秒。这样的调用无处不在,所以我们有必要详细了解下,gettimeofday这个函数做了些什么?内核1ms一次的时钟中断处理真的可以支持tv_usec字段达到微秒精度吗?它的调用成本在i386/x86_64体系架构上代价一样吗?如果在系统繁忙时,频繁的调用它有问题吗?...转载 2020-04-15 09:16:05 · 2601 阅读 · 0 评论 -
kprobe工作原理
kprobe工作原理kprobe的工作过程大致如下:1)注册kprobe。注册的每个kprobe对应一个kprobe结构体,该结构中记录着插入点(位置),以及该插入点本来对应的指令original_opcode;2)替换原有指令。使能kprobe的时候,将插入点位置的指令替换为一条异常(BRK)指令,这样当CPU执行到插入点位置时会陷入到异常态;3)执行pre_handler...转载 2019-11-25 11:24:30 · 384 阅读 · 0 评论 -
httpd 403
apache httpd服务器403 forbidden的问题一、问题描述在apache2的httpd配置中,很多情况都会出现403。刚安装好httpd服务,当然是不会有403的问题了。主要是修改了一些配置后出现,问题描述如下:修改了DocumentRoot目录指向后,站点出现403错误。 设置了虚拟主机目录也可能导致403。 apache的httpd服务成功启动,看起来都...转载 2019-10-28 12:02:28 · 1884 阅读 · 0 评论 -
error while loading shared libraries:libresolv.so.2: cannot open shared object file:Permission denied
解决办法如下:将guest里边的selinux禁用就可以了vi etc/sysconfig/selinux,将selinux设置为disable就可以了。原创 2011-06-16 12:43:00 · 6603 阅读 · 0 评论 -
内核中的 likely() 与 unlikely()
在 2.6 内核中,随处可以见到 likely() 和 unlikely() 的身影,那么为什么要用它们?它们之间有什么区别? 首先要明确: if(likely(value)) 等价于 if(value) if(unlikely(value)) 也等价于 if(value)也就是说 likely() 和 unlikely() 从阅读和理解原创 2011-06-14 17:59:00 · 518 阅读 · 0 评论 -
epoll accept 惊群
epoll最终和accept一样解决了新建连接的惊群问题 patch地址: https://github.com/torvalds/linux/commit/df0108c5da561c66c333bb46bfe3c1fc65905898patch比较简单, 下面摘录了一部分关键修改~~在加入listen socket的sk_sleep队列 的唤醒队列里使用了转载 2016-12-20 10:23:59 · 557 阅读 · 0 评论 -
浮点数的存储
C语言,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从转载 2017-01-18 10:27:06 · 287 阅读 · 0 评论 -
通过/proc查看Linux内核态调用栈来定位卡死问题
前几天碰到一个问题:一个进程运行过程中挂死了,把gdb挂上去之后bt打印的内容为空,后来通过查看 /proc 文件系统,查看程的调用栈,才发现是发消息给内核态程序时,内核态一直没有响应,导致用户态进程挂死。刚好在网上看到一篇描述通过 /proc 文件系统来定位问题的文章,这篇文章讲解得比较清楚,因此尝试翻译出来。原文地址:Peeking into Linux kernel-land using转载 2017-05-07 15:13:17 · 9426 阅读 · 0 评论 -
pthread_join与pthread_detach细节问题
pthread_t pthr;pthread_create(&pthr, NULL, thread_handler, NULL);...void* thread_handler(void* arg){ /* do something */ pthread_join(pthr, NULL);} 上面的代码不好使转载 2017-10-27 09:15:56 · 547 阅读 · 0 评论 -
记录一个软中断问题
前些天发现XEN虚拟机上的Nginx服务器存在一个问题:软中断过高,而且大部分都集中在同一个CPU,一旦系统繁忙,此CPU就会成为木桶的短板。在问题服务器上运行「top」命令可以很明显看到「si」存在异样,大部分软中断都集中在 1 号CPU上,其它的CPU完全使不上劲儿:shell> topCpu0: 11.3%us, 4.7%sy, 0.0%ni, 82.5%id,转载 2017-12-22 15:25:33 · 322 阅读 · 0 评论 -
卸载内核
卸载自己编译的内核在/boot目录下,存放着内核文件及镜像: /boot/vmlinuz*KERNEL-VERSION* /boot/initrd*KERNEL-VERSION* /boot/System-map*KERNEL-VERSION* /boot/config-KERNEL-VERSION /lib/modules KERNEL-VERSION代表原创 2018-01-25 11:47:28 · 534 阅读 · 0 评论 -
开源线程池
https://blog.csdn.net/pkueecser/article/details/13380757原创 2018-03-28 16:47:37 · 1418 阅读 · 0 评论 -
cpu 运行主频和实际主频不一致
1.查看CPU运行主频与实际主频 grep -E '^model name|^cpu MHz' /proc/cpuinfo 结果: model name : Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz cpu MHz : 1200.000 运行主频只有1.2G。2.解决办法: 1....原创 2018-07-16 10:16:59 · 5269 阅读 · 1 评论 -
通过/proc查看Linux内核态调用栈来定位问题
前几天碰到一个问题:一个进程运行过程中挂死了,把gdb挂上去之后bt打印的内容为空,后来通过查看 /proc 文件系统,查看程的调用栈,才发现是发消息给内核态程序时,内核态一直没有响应,导致用户态进程挂死。刚好在网上看到一篇描述通过 /proc 文件系统来定位问题的文章,这篇文章讲解得比较清楚,因此尝试翻译出来。原文地址:Peeking intoLinuxkernel-land using /...转载 2019-03-22 16:19:34 · 2173 阅读 · 0 评论 -
返回地址截断
主要是没有引用头文件,编译默认返回值是int,导致截断原创 2019-07-16 17:43:12 · 226 阅读 · 0 评论 -
Program received signal SIGPIPE, Broken pipe
在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。client端通过 pipe 发送信息到server端后,就关闭client端, 这时server端,返回信息给 client 端时就产生Broken pipe 信号了。 对于产生信号,我们可以在产生信号前利用方法 signal(int signu原创 2011-06-15 14:05:00 · 762 阅读 · 0 评论