自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(118)
  • 资源 (8)
  • 收藏
  • 关注

原创 linux kernel 2.6.32内核代码注释

看内核代码也有一段时间了,记了很多注释,分享出来。地址:http://www.kuaipan.cn/file/id_61251671069793742.htm

2013-06-30 07:19:30 5289 5

原创 /proc/net/tcp中各项参数说明

/proc/net/tcp中的内容由tcp4_seq_show()函数打印,该函数中有三种打印形式,我们这里这只列出状态是TCP_SEQ_STATE_LISTENING或TCP_SEQ_STATE_ESTABLISHED的情况,如下所示:

2014-03-11 18:02:54 20563

原创 源目的IP和端口都相同的连接出现的原因

线上遇到了一个比较特殊的连接,它的源目的IP和端口完全相同,复现的场景是:同一个机器上的两个模块A和B通信,A模块会向B模块的监听套接字发起连接请求,B模块重启的时候就很容易出现这样的问题。下图是在线下复现的连接情况:  这种类型的连接产生的过程类似于同时打开的情况。同时打开的情况是两个机器同时向另一个机器的已知端口发送SYN段,一个机器上发送的SYN段的目的IP和端口是另

2014-03-10 20:20:07 10828 1

原创 浅谈shutdown()和close()的区别

shutdown()函数可以选择关闭全双工连接的读通道或者写通道,如果两个通道同时关闭,则这个连接不能再继续通信。close()函数会同时关闭全双工连接的读写通道,除了关闭连接外,还会释放套接字占用的文件描述符。而shutdown()只会关闭连接,但是不会释放占用的文件描述符。所以即使使用了SHUT_RDWR类型调用shutdown()关闭连接,也仍然要调用close()来释放连接占用的文件描述符

2014-03-10 13:15:16 10796

原创 相同端口的UDP套接字数量过多导致软中断占用CPU利用率高的原因分析

导致出现很多相同端口的UDP套接字的原因有两点:    1)在reload的时候,调用shutdown()而不是close()来关闭UDP套接字。shutdown()是用来关闭连接的,但是文件描述符还是会存在。UDP协议并没有提供shutdown接口(参见udp_prot),所以调用shutdown()并没有真的关闭套接字,而且reload的次数太多。    2)设置了SO_REUSEAD

2014-03-07 18:35:41 5148 1

原创 Linux虚拟内存系统常用参数说明

1.admin_reserve_kbytes   给有cap_sys_admin权限的用户保留的内存数量,默认值是min(free pages * 3%, 8MB)。这些内存是为了给管理员登录和杀死进程恢复系统提供足够的内存。2.block_dump   如果设置的是非零值,则会启用块I/O调试。更多的关于块I/O调试的信息可以参见Documentation/laptops/lapto

2014-02-19 12:28:10 5613

原创 SystemTap----通过pid和fd来获取对应的socket实例地址

说明:1.这个脚本可能会导致内核panic,所以一定不要在生产环境中使用,切记!       2.这个脚本不具备通用性,如果你使用了lxc或者cgroup,获得的结果可能有误或者找不到       3.这个脚本只是提供了找到socket实例的方法,如果你想获取这个套接字的其他信息需要自己编写脚本,           通过获得的socket实例来获取。插入的位置在脚本中已标注,可以直接

2013-12-29 14:12:37 4816

原创 Linux CFS调度系统----周期性调度器

周期性调度器由scheduler_tick()函数实现,在每个时钟中断中都会调用该函数来更新一些统计量,并且会激活当前进程所属调度类的周期性处理接口,代码流程如下所示:  具体来说,scheduler_tick()做了以下工作:    1)更新就绪队列的实际时钟时间,不是虚拟时钟时间。    2)更新就绪队列权重数组cpu_load中的权重值    3)调用当前CPU上

2013-12-26 13:08:48 2883

原创 Linux CFS调度系统----进程优先级和权重

调度器的一般原理是,根据所能分配的计算能力,向系统中的每个进程提供最大的公平性。调度器分配的资源就是CPU的时间,尽量保证每个进程都获得相同的CPU时间。Linux的CFS调度系统不同于O(1)调度器,不需要时间片概念,至少不需要传统的时间片。CFS调度系统只考虑进程的等待时间,即进程在就绪队列中已经等待了多长时间。但是并非系统上的所有进程都同样重要,调度器也要保证一些重要的进程优先执行,或者要获

2013-12-19 14:14:38 4953

原创 Linux TCP协议栈中的预分配缓存

TCP协议栈中的预分配缓存的大小由sock结构中的sk_forward_alloc成员描述,在创建套接字时该成员被初始化为0(参见sk_clone())。虽然这个成员在内核文档和《Linux内核源码剖析---TCP/IP实现中》都描述为预分配缓存的长度,但是在代码中并没有看到使用这个成员来预先分配一段内存,更多地是通过这个成员来控制TCP协议栈使用的内存。其实sk_forward_alloc更应该

2013-12-17 14:33:49 3953

原创 Redhat Enterprise 4.3中静态编译perf

注:编译中使用的perf源码和内核版本并不是标准版中的源码,是我们内部的一个版本。这篇文章主要是提供一些思路,在你的环境中编译遇到的问题可能和我这里的不同,源文件或者Makefile文件的内容也会不一致。如果有问题,欢迎交流。    perf是在kernel 2.6.31中才加入到内核树中,较早的发行版本中内核版本都比较老,都没有带perf。如果要使用perf,需要自己去编译。这里进行的是

2013-11-11 16:50:50 6492

原创 Kprobes源码分析----kprobe的处理

在探测点注册kprobe后,会在执行到探测点的指令时触发断点异常(trap 3)。kprobes在断点异常的通知链die_chain上注册了自己的处理函数,这个函数就是kprobe_exception_notify()。kprobe_exception_notify()不仅会接收到断点异常的通知,还会接收到调试异常(trap 1)和保护异常的通知。这篇文章主要围绕这个函数的处理来展开。 

2013-11-10 09:26:10 2830

原创 Kprobes源码分析----kprobe的注册

kprobes是一个动态地收集调试和性能信息的工具,使用它几乎可以跟踪任何函数或被执行的指令。它的机制也很简单,就是将被探测的位置的指令替换为断点指令(不考虑jmp优化),断点指令被执行后会通过notifier_call_chain机制来通知kprobes,kprobes会首先调用用户指定的pre_handler接口。执行pre_handler接口后会单步执行原始的指令,如果用户也指定了post_

2013-11-07 13:44:30 3314

原创 解决mv命令导致的cman启动失败问题

参考资料:https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=667703                    http://www.qingsword.com/qing/1086.html  今天使用cman来管理集群,在启动时报错,错误信息如下:[root@CentOS____102 ~]# serv

2013-10-30 19:08:29 3820

原创 《浅谈TCP协议栈》ppt分享

这个是在公司内部串讲时候的ppt,分享一下!浅谈TCP协议栈.pptx

2013-10-22 23:36:46 1961

原创 SYN cookies机制下连接的建立

在正常情况下,服务器端接收到客户端发送的SYN包,会分配一个连接请求块(即request_sock结构),用于保存连接请求信息,并且发送SYN+ACK包给客户端,然后将连接请求块添加到半连接队列中。客户端接收到SYN+ACK包后,会发送ACK包对服务器端的包进行确认。服务器端收到客户端的确认后,根据保存的连接信息,构建一个新的连接,放到监听套接字的连接队列中,等待用户层accept连接。这是正常的

2013-10-11 16:55:44 8806

原创 gcc中的constructor属性和destructor属性

constructor属性可以使函数在main()函数之前执行,destructor属性会让函数在main()函数完成或调用exit()之后被执行。这些属性可以用来在程序运行之前初始化所需的数据,非常有用。而且这两个属性都还可以指定优先级,控制使用修饰的函数的执行顺序,优先级的值必须大于100,因为0到100之间的优先级由gcc来使用,优先级的值越小,优先级越高,会优先执行。另外还有一点需要注意,

2013-09-14 22:52:54 4986

原创 C语言中没有main函数生成可执行程序的几种方法

1、define预处理指令这种方式很简单,只是简单地将main字符串用宏来代替,或者使用##拼接字符串。示例程序如下:#include #define begin mainint begin(void){printf("Hello, World!\n");return 0;}#include #define beg

2013-09-12 23:51:53 7054

原创 Linux下可执行程序调试信息的分离及release程序的调试

前两天在群里看到在讨论如何把debug版中的符号表加到release版本中,觉得这个非常有用,所以学习一下。使用的工具是objcopy。如果要生成单独的调试信息文件,命令如下:objcopy –only-keep-debug foo foo.dbg如果要去除调试信息(还可以使用strip命令),命令如下:objcopy --only-keep-debug

2013-09-12 15:07:57 5077

原创 使用perf生成Flame Graph(火焰图)

具体的步骤参见这里: 《flame graph:图形化perf call stack数据的小工具》  使用SystemTap脚本制作火焰图,内存较少时,分配存储采样的数组可能失败,需要编写脚本,还要安装kernel的debuginfo包。使用perf的话,相对来说要简单一些。不过在有kernel的debuginfo包的时候,采样显示的信息要更丰富一些。  为了使用perf制作火焰图方便

2013-09-10 11:31:21 9077 1

原创 探究Linux下参数传递及查看和修改方法

X86-64下有16个64位寄存器,其中%rdi、%rsi、%rdx,%rcx、%r8、%r9用作传递函数参数,分别对应第1个参数、第2个参数直到第6个参数,如下图所示(图片来自网络):  如果函数的参数个数超过6个,则超过的参数直接使用栈来传递。在被调用函数执行前,会先将寄存器中的参数压入堆栈,之后的访问会通过栈寄存器加上偏移位置来访问。下面我们结合程序及其反汇编的结果来看一看。C语

2013-09-08 18:15:17 4577

原创 使用Systemtap生成Flame Graph(火焰图)

参考资料: 《Systemtap生成Flame Graph(火焰图)》之所以再写一篇博客,主要是原文的内容显示的有问题,直接贴文章中的脚本有问题,另外文章中也没有说明可能遇到的一些问题。以下的安装步骤是在CentOS 6.4下进行的,内核版本是2.6.32-358.el6.x86_64,选择的应用软件是nginx-1.4.2。1、检查内核是否提供utrace/uprobes用户态支持

2013-09-05 18:12:58 6888 7

原创 解决接收不到组播包的问题

目前用的集群是在应用层实现的,主要功能是实现在机器之间互转请求。今天在部署的时候,发现请求没有在节点之间互转,相同的请求发送一次后miss,第二次发送的时候还是miss。正常来说,第一次miss后会在集群内缓存一份,之后再有关于这个文件的请求不管发送到哪个机器都应该是hit的。集群之间的探活用的是组播消息,出现这种问题肯定是因为接收组播报文出了问题。之前用的时候都没有问题,所以先从环境入手来查

2013-09-05 15:04:05 40840 3

原创 IP数据包的输入与输出

IP层主要函数之间的调用关系如下图所示:上面的图主要是拷贝的《Linux内核源码剖析----TCP/IP实现上册》中的图11.3,原图中有部分错误,所以这里重新绘制了一下,并且去掉了一些冗余的部分。下面简述一下数据包传递的大致过程:一、IP数据包的输入ip_rcv()是网络层(IPv4,以下同)接收数据包的入口函数,链路层在接收到数据包后调用netif_receiv

2013-08-28 17:42:49 2099

原创 Linux中查看是否是固态硬盘(SSD)

最近在准备测试,需要看看哪些机器挂载的是ssd硬盘,Google了一圈看到了许多方法,但都云里雾里的,不知道怎么确定。ssd硬盘貌似使用的也是scsi接口,所以根据盘符的名称也是判断不出来的。最后群里eric大神告知lsscsi工具,试了一下,非常简单,显示的也很直接,分享一下。废话不多说,直接上图和结果,如下所示:[root@FWD_YF_009_110 ~]# lsscsi

2013-08-26 11:57:31 31989 1

原创 SystemTap----将SystemTap脚本编译成内核模块

当运行SystemTap脚本时,会根据脚本生成一个内核模块,然后插入到系统中执行后退出。这个过程总共分为5个阶段:parse, elaborate, translate, compile, run,对应的编号为1-5.stap命令的-p选项可以用来指定在哪个阶段停止,利用这个选项可以将脚本编译成内核模块。正常情况下,SystemTap脚本只能在部署了SystemTap执行环境(安装内核的开发包

2013-08-25 21:15:24 2907

原创 SystemTap----利用stap命令来查找内核函数定义

我们知道stap命令的-l(或-L)选项可以列出指定的某个probe描述中所有符合的probe点的列表,例如可以使用下面的命令,看到所有可以probe的函数:stap -l 'kernel.function("*")'今天在看书的时候,突然想到可以利用这个选项来找到一些内核函数的定义,例如sys_open()的定义。不管是source insight还是vim+ctag+csc

2013-08-24 19:57:13 6980

原创 SystemTap----thread_indent()函数分析

thread_indent是systemtap中一个非常有用的函数,声明如下:thread_indent:string(delta:long)它可以输出当前probe所处的可执行程序名称、线程id、函数执行的相对时间和执行的次数(通过空格的数量)信息,它的返回值就是一个字符串。参数delta是在每次调用时增加或移除的空白数量。在没有看thread_indent函

2013-08-24 15:15:41 3737

原创 SystemTap----常用变量、宏、函数和技巧

后面会持续更新,方便自己,方便大家.......一、宏1. kderef从指定的地址处读取指定大小的值格式为:kderef(size, address);其中address为要读取的地址值,size是要是读取的值的大小,返回值就是所读取的值。2.kread在嵌入的C代码中安全地读取指针值格式为:kread(&(address))

2013-08-18 18:39:21 7342

原创 SystemTap----嵌入C代码

SystemTap支持guru模式,通过-g选项来以这种模式执行SystemTap脚本。在guru模式下,嵌入的C代码在“%{"和“%}"标记之间,这些代码会原封不动地放到生成的模块中。嵌入的C代码不仅可以作为函数体,还可以出现在SystemTap描述中(例如函数等),示例如下:%{#include linux/in.h>#include linux/ip.h>%}

2013-08-18 10:07:27 3651

原创 SystemTap----初始化和遍历数组

SystemTap数组中的索引项可以是long或者string类型(systemtap的基本类型),访问数组项的方式和C语言类似,数组名[索引]。例如odds[x],odds是数组名,x是索引。下面的示例是以long为索引项,如下所示:global oddsprobe begin {printf("probe begin\n");for (i = 0; i

2013-08-17 22:45:04 3353

原创 netpoll浅析

netpoll只是一种框架和一些接口,只有依赖这个框架和接口实现的netpoll实例,netpoll才能发挥它的功能。类似于kernel中的vfs,vfs本身并不会去做具体的文件操作,只是为不同的文件系统提供了一个框架。netpoll不依赖于网络协议栈,因此在内核网络及I/O子系统尚未可用时,也可以发送或接收数据包。当然netpoll能够处理的数据包类型也很有限,只有UDP和ARP数据包,并且只能

2013-08-15 10:24:11 4775

原创 实战RPM包制作

在开发中经常会用到一些rpm包,但是一直没有自己手动制作过。今天在制作的时候意外地还解决了自己以前一直困惑的问题,就是怎么制作rpm debuginfo包,类似CentOS官网那样的debuginfo包。原来在制作rpm时如果没有特殊设置就会在RPMS目录下同时生成rpm包及对应的debuginfo包。  下面总结一下制作rpm包的流程以及遇到的一些问题的解决。  1、配置工作路径

2013-08-11 22:10:07 9472

原创 CentOS下利用sshpass不用手动输入密码远程执行命令

在测试的时候要同时操作多台机器,每次都要挨个去执行几乎相同的命令或者修改一些设置,这样很影响工作效率也很烦,所以就想写一个脚本,远程自动去做这些操作。远程执行命令很简单,但是不能在执行命令加上命令,还得手动输入,放在脚本里肯定不行。Google一番看到了这篇文章《ssh免输密码自动登录》,上面介绍了三种方法。我选择的是sshpass,简单方便,内网测试,也不用考虑安全的问题。不过CentOS发行版

2013-08-08 11:10:45 5597

原创 为什么服务器程序在部署时需要调度器?

随着互联网规模的不断扩大,服务器承载的压力也不断增加,对服务的质量要求也越来越高。最理想的情况是,使用低成本的服务器,承载更大的压力,并且7x24小时不中断服务。通常使用的方式就是部署集群,调度器+服务器+存储这样的架构。注意,集群不是单指的调度器,它是一个完整的系统,调度器只是集群的入口,起到负载均衡或内容调度的作用。还有一种方式是在服务器程序中加入集群的功能,使服务器节点之间可以通信,实现基于

2013-08-04 09:06:33 2203

原创 利用glibc中锁结构的信息解决死锁问题

首先非常感谢老丁和老李同学的帮助,没有他们这个问题估计又得搞很久。遇见这个问题,真是头疼。不熟悉代码、不熟悉流程,但是领导还是把活给排下来了(实在不解),只能硬着头皮找了。问题是这样的,cache服务器中有一个存储对象的哈希表,每次访问哈希表时都要获取hash_rwlock读写锁,现在进程在获取读锁时死锁。使用gdb进入3个worker进程,发现死锁的位置都一样,都是在获取hash_rwloc

2013-07-26 14:32:26 2089 1

原创 类型转换导致的程序异常

通过下面的程序来介绍:#include int main(void){ int i; unsigned long long type = 0; unsigned long long a = 0; for(i=0;i<34;i++){ a = 1<<i; printf("a %llu, i = %d\n",a, i);

2013-07-25 18:07:28 1531

原创 gdb:不退出程序的情况下打印函数中的局部变量

参考资料:点击打开链接  借助于上面的参考资料,编写自己的脚本工具。参考资料中也是借鉴pstack这个工具,它是用一个脚本,脚本中通过调用gdb来打印当前运行的栈信息,而不用中断程序或手动gdb。更多的信息,还是去看参考资料吧,上面讲的比较详细。  我的脚本如下:#!/bin/shcommand="source key.gdb"readnever=""GDB=${GDB:-/us

2013-07-24 17:05:13 3558

原创 gdb:循环打印数组

今天为了精确查看集群中哈希表中每个机器占有的槽位数,所以需要在gdb中进行统计。哈希表是一个大的数组,如果直接使用gdb输出数量太大,而且没法统计。Google了一番,终于找到一种方法,分享一下,也便于日后查看。在gdb的脚本中循环遍历整个哈希表,并且加上判断条件来进行统计,然后输出结果。导入gdb脚本的方式很简单,gdb中输入“source 脚本名”。  我的脚本如下:set $i=32

2013-07-24 17:03:18 11353

原创 Linux kernel中网络设备的管理

kernel中使用net_device结构来描述网络设备,这个结构是网络驱动及接口层中最重要的结构。该结构不仅描述了接口方面的信息,还包括硬件信息,致使该结构很大很复杂。通过这个结构,内核在底层的网络驱动和网络层之间构建了一个网络接口核心层(这个叫法引自《TCP迁移报告》),这个中间层类似于文件子系统的VFS。这样底层的驱动程序就不需要过多地关注上层的网络协议,只需要通过内核提供的网络接口核心层就

2013-07-21 22:44:36 4387

LVS手册_可伸缩网络服务的设计与实现_1.0

LVS手册,了解LVS的基本原理及工作方式,学习集群的入门手册

2013-01-15

深入理解计算机系统

国外经典教程, 经典的讲解操作系统底层原理的好书!

2013-01-15

SQL语句经典大全SQL语句经典大全SQL语句经典大全

SQL语句经典大全 SQL语句经典大全 SQL语句经典大全

2011-04-22

Linux_C高级程序员指南.pdfLinux_C高级程序员指南.pdf

Linux_C高级程序员指南.pdf Linux_C高级程序员指南.pdf Linux_C高级程序员指南.pdf

2011-04-19

经典算法大全,学习算法的好东东

经典的算法大全,对于初学者很好哦。经典的算法大全,对于初学者很好哦。经典的算法大全,对于初学者很好哦。

2011-04-14

C#读取配置文件详细教程

用C#读取配置文件,很详细的哦,而且使用的方法也是比较优化的

2011-04-14

进程线程的概念,讲的很详细

介绍进程线程很详细的资料哦,对学习编程语言很有帮助。面试的时候也会经常被问到这样的问题

2011-04-14

用C#操作数据库用C#操作数据库,很多很全哦

用C#操作数据库,很多很全哦 用C#操作数据库,很多很全哦 用C#操作数据库,很多很全哦

2011-04-06

空空如也

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

TA关注的人

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