<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Justlinux2010的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/moonvs2010</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; moonvs2010]]></copyright><item><title><![CDATA[/proc/net/tcp中各项参数说明]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/21028797</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/21028797</guid><author>moonvs2010</author><pubDate>Tue, 11 Mar 2014 18:02:54 +0800</pubDate><description><![CDATA[/proc/net/tcp中的内容由tcp4_seq_show()函数打印，该函数中有三种打印形式，我们这里这只列出状态是TCP_SEQ_STATE_LISTENING或TCP_SEQ_STATE_ESTABLISHED的情况，如下所示：]]></description><category></category></item><item><title><![CDATA[源目的IP和端口都相同的连接出现的原因]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/20947609</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/20947609</guid><author>moonvs2010</author><pubDate>Mon, 10 Mar 2014 20:20:07 +0800</pubDate><description><![CDATA[线上遇到了一个比较特殊的连接，它的源目的IP和端口完全相同，复现的场景是：同一个机器上的两个模块A和B通信，A模块会向B模块的监听套接字发起连接请求，B模块重启的时候就很容易出现这样的问题。下图是在线下复现的连接情况：





  这种类型的连接产生的过程类似于同时打开的情况。同时打开的情况是两个机器同时向另一个机器的已知端口发送SYN段，一个机器上发送的SYN段的目的IP和端口是另]]></description><category></category></item><item><title><![CDATA[浅谈shutdown()和close()的区别]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/20913755</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/20913755</guid><author>moonvs2010</author><pubDate>Mon, 10 Mar 2014 13:15:16 +0800</pubDate><description><![CDATA[shutdown()函数可以选择关闭全双工连接的读通道或者写通道，如果两个通道同时关闭，则这个连接不能再继续通信。close()函数会同时关闭全双工连接的读写通道，除了关闭连接外，还会释放套接字占用的文件描述符。而shutdown()只会关闭连接，但是不会释放占用的文件描述符。所以即使使用了SHUT_RDWR类型调用shutdown()关闭连接，也仍然要调用close()来释放连接占用的文件描述符]]></description><category></category></item><item><title><![CDATA[相同端口的UDP套接字数量过多导致软中断占用CPU利用率高的原因分析]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/20727135</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/20727135</guid><author>moonvs2010</author><pubDate>Fri, 07 Mar 2014 18:35:41 +0800</pubDate><description><![CDATA[导致出现很多相同端口的UDP套接字的原因有两点：
    1)在reload的时候，调用shutdown()而不是close()来关闭UDP套接字。shutdown()是用来关闭连接的，但是文件描述符还是会存在。UDP协议并没有提供shutdown接口(参见udp_prot)，所以调用shutdown()并没有真的关闭套接字，而且reload的次数太多。
    2)设置了SO_REUSEAD]]></description><category></category></item><item><title><![CDATA[Linux虚拟内存系统常用参数说明]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/19482359</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/19482359</guid><author>moonvs2010</author><pubDate>Wed, 19 Feb 2014 12:28:10 +0800</pubDate><description><![CDATA[1.admin_reserve_kbytes
   给有cap_sys_admin权限的用户保留的内存数量，默认值是min(free pages * 3%, 8MB)。这些内存是为了给管理员登录和杀死进程恢复系统提供足够的内存。
2.block_dump
   如果设置的是非零值，则会启用块I/O调试。更多的关于块I/O调试的信息可以参见Documentation/laptops/lapto]]></description><category></category></item><item><title><![CDATA[SystemTap----通过pid和fd来获取对应的socket实例地址]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/17653601</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/17653601</guid><author>moonvs2010</author><pubDate>Sun, 29 Dec 2013 14:12:37 +0800</pubDate><description><![CDATA[说明：1.这个脚本可能会导致内核panic，所以一定不要在生产环境中使用，切记！
       2.这个脚本不具备通用性，如果你使用了lxc或者cgroup，获得的结果可能有误或者找不到
       3.这个脚本只是提供了找到socket实例的方法，如果你想获取这个套接字的其他信息需要自己编写脚本，  
         通过获得的socket实例来获取。插入的位置在脚本中已标注，可以直接]]></description><category></category></item><item><title><![CDATA[Linux CFS调度系统----周期性调度器]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/17580583</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/17580583</guid><author>moonvs2010</author><pubDate>Thu, 26 Dec 2013 13:08:48 +0800</pubDate><description><![CDATA[周期性调度器由scheduler_tick()函数实现，在每个时钟中断中都会调用该函数来更新一些统计量，并且会激活当前进程所属调度类的周期性处理接口，代码流程如下所示：


  具体来说，scheduler_tick()做了以下工作：
    1）更新就绪队列的实际时钟时间，不是虚拟时钟时间。

    2）更新就绪队列权重数组cpu_load中的权重值
    3）调用当前CPU上]]></description><category></category></item><item><title><![CDATA[Linux CFS调度系统----进程优先级和权重]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/17414929</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/17414929</guid><author>moonvs2010</author><pubDate>Thu, 19 Dec 2013 14:14:38 +0800</pubDate><description><![CDATA[调度器的一般原理是，根据所能分配的计算能力，向系统中的每个进程提供最大的公平性。调度器分配的资源就是CPU的时间，尽量保证每个进程都获得相同的CPU时间。Linux的CFS调度系统不同于O(1)调度器，不需要时间片概念，至少不需要传统的时间片。CFS调度系统只考虑进程的等待时间，即进程在就绪队列中已经等待了多长时间。但是并非系统上的所有进程都同样重要，调度器也要保证一些重要的进程优先执行，或者要获]]></description><category></category></item><item><title><![CDATA[Linux TCP协议栈中的预分配缓存]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/17376711</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/17376711</guid><author>moonvs2010</author><pubDate>Tue, 17 Dec 2013 14:33:49 +0800</pubDate><description><![CDATA[TCP协议栈中的预分配缓存的大小由sock结构中的sk_forward_alloc成员描述，在创建套接字时该成员被初始化为0（参见sk_clone()）。虽然这个成员在内核文档和《Linux内核源码剖析---TCP/IP实现中》都描述为预分配缓存的长度，但是在代码中并没有看到使用这个成员来预先分配一段内存，更多地是通过这个成员来控制TCP协议栈使用的内存。其实sk_forward_alloc更应该]]></description><category></category></item><item><title><![CDATA[Redhat Enterprise 4.3中静态编译perf]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/15340261</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/15340261</guid><author>moonvs2010</author><pubDate>Mon, 11 Nov 2013 16:50:50 +0800</pubDate><description><![CDATA[注：编译中使用的perf源码和内核版本并不是标准版中的源码，是我们内部的一个版本。这篇文章主要是提供一些思路，在你的环境中编译遇到的问题可能和我这里的不同，源文件或者Makefile文件的内容也会不一致。如果有问题，欢迎交流。

    perf是在kernel 2.6.31中才加入到内核树中，较早的发行版本中内核版本都比较老，都没有带perf。如果要使用perf，需要自己去编译。这里进行的是]]></description><category></category></item><item><title><![CDATA[Kprobes源码分析----kprobe的处理]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/15026141</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/15026141</guid><author>moonvs2010</author><pubDate>Sun, 10 Nov 2013 09:26:10 +0800</pubDate><description><![CDATA[在探测点注册kprobe后，会在执行到探测点的指令时触发断点异常（trap 3）。kprobes在断点异常的通知链die_chain上注册了自己的处理函数，这个函数就是kprobe_exception_notify()。kprobe_exception_notify()不仅会接收到断点异常的通知，还会接收到调试异常（trap 1）和保护异常的通知。这篇文章主要围绕这个函数的处理来展开。

  ]]></description><category></category></item><item><title><![CDATA[Kprobes源码分析----kprobe的注册]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/14450001</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/14450001</guid><author>moonvs2010</author><pubDate>Thu, 07 Nov 2013 13:44:30 +0800</pubDate><description><![CDATA[kprobes是一个动态地收集调试和性能信息的工具，使用它几乎可以跟踪任何函数或被执行的指令。它的机制也很简单，就是将被探测的位置的指令替换为断点指令（不考虑jmp优化），断点指令被执行后会通过notifier_call_chain机制来通知kprobes，kprobes会首先调用用户指定的pre_handler接口。执行pre_handler接口后会单步执行原始的指令，如果用户也指定了post_]]></description><category></category></item><item><title><![CDATA[解决mv命令导致的cman启动失败问题]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/13651775</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/13651775</guid><author>moonvs2010</author><pubDate>Wed, 30 Oct 2013 19:08:29 +0800</pubDate><description><![CDATA[参考资料：https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=667703
                    http://www.qingsword.com/qing/1086.html
  今天使用cman来管理集群，在启动时报错，错误信息如下：



[root@CentOS____102 ~]# serv]]></description><category></category></item><item><title><![CDATA[《浅谈TCP协议栈》ppt分享]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/12956753</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/12956753</guid><author>moonvs2010</author><pubDate>Tue, 22 Oct 2013 23:36:46 +0800</pubDate><description><![CDATA[这个是在公司内部串讲时候的ppt，分享一下！
浅谈TCP协议栈.pptx]]></description><category></category></item><item><title><![CDATA[SYN cookies机制下连接的建立]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/12619761</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/12619761</guid><author>moonvs2010</author><pubDate>Fri, 11 Oct 2013 16:55:44 +0800</pubDate><description><![CDATA[在正常情况下，服务器端接收到客户端发送的SYN包，会分配一个连接请求块（即request_sock结构），用于保存连接请求信息，并且发送SYN+ACK包给客户端，然后将连接请求块添加到半连接队列中。客户端接收到SYN+ACK包后，会发送ACK包对服务器端的包进行确认。服务器端收到客户端的确认后，根据保存的连接信息，构建一个新的连接，放到监听套接字的连接队列中，等待用户层accept连接。这是正常的]]></description><category></category></item><item><title><![CDATA[gcc中的constructor属性和destructor属性]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/11695645</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/11695645</guid><author>moonvs2010</author><pubDate>Sat, 14 Sep 2013 22:52:54 +0800</pubDate><description><![CDATA[constructor属性可以使函数在main()函数之前执行，destructor属性会让函数在main()函数完成或调用exit()之后被执行。这些属性可以用来在程序运行之前初始化所需的数据，非常有用。而且这两个属性都还可以指定优先级，控制使用修饰的函数的执行顺序，优先级的值必须大于100，因为0到100之间的优先级由gcc来使用，优先级的值越小，优先级越高，会优先执行。另外还有一点需要注意，]]></description><category></category></item><item><title><![CDATA[C语言中没有main函数生成可执行程序的几种方法]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/11621087</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/11621087</guid><author>moonvs2010</author><pubDate>Thu, 12 Sep 2013 23:51:53 +0800</pubDate><description><![CDATA[1、define预处理指令
这种方式很简单，只是简单地将main字符串用宏来代替，或者使用##拼接字符串。示例程序如下：


#include 

#define begin main

int begin(void)
{
printf("Hello, World!\n");
return 0;
}






#include 

#define beg]]></description><category></category></item><item><title><![CDATA[Linux下可执行程序调试信息的分离及release程序的调试]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/11604249</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/11604249</guid><author>moonvs2010</author><pubDate>Thu, 12 Sep 2013 15:07:57 +0800</pubDate><description><![CDATA[前两天在群里看到在讨论如何把debug版中的符号表加到release版本中，觉得这个非常有用，所以学习一下。
使用的工具是objcopy。
如果要生成单独的调试信息文件，命令如下：


objcopy –only-keep-debug foo foo.dbg


如果要去除调试信息（还可以使用strip命令），命令如下：


objcopy --only-keep-debug]]></description><category></category></item><item><title><![CDATA[使用perf生成Flame Graph(火焰图)]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/11520829</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/11520829</guid><author>moonvs2010</author><pubDate>Tue, 10 Sep 2013 11:31:21 +0800</pubDate><description><![CDATA[具体的步骤参见这里： 
《flame graph：图形化perf call stack数据的小工具》
  使用SystemTap脚本制作火焰图，内存较少时，分配存储采样的数组可能失败，需要编写脚本，还要安装kernel的debuginfo包。使用perf的话，相对来说要简单一些。不过在有kernel的debuginfo包的时候，采样显示的信息要更丰富一些。
  为了使用perf制作火焰图方便]]></description><category></category></item><item><title><![CDATA[探究Linux下参数传递及查看和修改方法]]></title><link>https://blog.youkuaiyun.com/moonvs2010/article/details/11392959</link><guid>https://blog.youkuaiyun.com/moonvs2010/article/details/11392959</guid><author>moonvs2010</author><pubDate>Sun, 08 Sep 2013 18:15:17 +0800</pubDate><description><![CDATA[X86-64下有16个64位寄存器，其中%rdi、%rsi、%rdx，%rcx、%r8、%r9用作传递函数参数，分别对应第1个参数、第2个参数直到第6个参数，如下图所示（图片来自网络）：


  如果函数的参数个数超过6个，则超过的参数直接使用栈来传递。在被调用函数执行前，会先将寄存器中的参数压入堆栈，之后的访问会通过栈寄存器加上偏移位置来访问。下面我们结合程序及其反汇编的结果来看一看。C语]]></description><category></category></item></channel></rss>