存档

‘内核技术’ 分类的存档

Linux下如何在应用层获取连接跟踪事件

2018年2月23日 没有评论 8,568 次浏览

承接上一篇,如果不仅仅只是需要系统当前连接跟踪的静态信息,而需要及时获取连接跟踪的事件信息,又该怎么做? 有两个示例可以获取Linux系统当前的连接跟踪信息,并在连接跟踪事件发生(例如新建连接,断开连接)时进行及时回调: 这里有一个go语言实现的程序:https://github.com/akashihi/conntrack-logger 在源码包libnetfilter_conntrack-1.0.6的utils目录下也有几个类似的实现: conntrack_events.c、ctexp_events.c、expect_events.c。 以conntrack_events.c为例看看效果: 1,先看看代码: #include... [阅读更多]

Linux下如何在应用层获取连接跟踪信息

2018年1月28日 没有评论 1,167 次浏览

一,办法1 写个内核模块,吧啦吧啦,这个看上去比较容易,但缺陷是: 1,如果要支持的系统环境比较复杂,比如有Ubuntu、CentOS、Fedora等不同的发行版,各个发行版还有不同的版本如Ubuntu12.04、Ubuntu14.04等,那么维护的工作量非常巨大。 2,内核代码一出错就宕机,风险极大。 二,办法2 采用pcap将数据包抓到应用层,分析数据包来进行连接跟踪,缺陷是包分析的工作量极大,抓包的对系统性能的极大损耗,而且万一有漏包,会导致连接跟踪信息不准确。 因此比较好的方式是直接利用系统自带的接口来获取,而Linux系统的nf_conntrack模块就提供了这个接口: #... [阅读更多]

Linux上应用程序进行系统调用陷入内核后执行的cpu会发生变化吗?

2016年10月29日 没有评论 15,614 次浏览

题目没有把问题完全描述清楚,举个栗子:假设在一个多核机器上(当然是Linux操作系统),有进程A当前运行于CPU 0上,当它进行系统调用陷入内核后,执行对应内核代码的也是CPU... [阅读更多]

Kernel 3.12里对引用计数器的优化

2013年10月19日 没有评论 8,412 次浏览

Linux Kernel... [阅读更多]

QUIC简介

2013年8月6日 没有评论 10,648 次浏览

QUIC,即Quick UDP Internet... [阅读更多]

分类: *nix技术, 内核技术 标签: ,

*nux平台上的C10M问题

2013年7月7日 没有评论 9,831 次浏览

对于做大量并发服务器端(比如Web服务器Nginx、Apache等)开发的童鞋,肯定知道有一个名为C10K的问题。当然,这是一个比较古老的问题了,从03年(非准确值)提及到现在已经有10余年之久。而随着整个网络相关技术的高速发展,包括CPU、网卡、操作系统等,人们对业务需求所追求的并发连接性能也从10K提升到10M级别,即所谓的C10M问题。这个问题的初次提及到现在应该还没多久,大概也就是2013年上半年的事情,本文就来具体看看其相关内容。 相比以前,现在的硬件很便宜,1200美元可以买一台8核CPU、64GB和带有固态硬盘以及10G万兆网卡的通用电脑。这种通用电脑的性能很高,足够充当各种网络服务设备,因此很多看似贴有服务器专用标签的网络设备,揭开标签纸之后,就是一台普普通通的个人通用电脑。 硬件不是10M问题的性能瓶颈所在处,真正的问题出在软件上,尤其是*nux操作系统。这里有几点: 首先,最初的设计是让Unix成为一个电话网络的控制系统,而不是成为一个服务器操作系统。对于控制系统而言,针对的主要目标是用户和任务,而并没有针对作为协助功能的数据处理做特别设计,也就是既没有所谓的快速路径、慢速路径,也没有各种数据服务处理的优先级差别。 其次,传统的CPU,因为只有一个核,操作系统代码以多线程或多任务的形式来提升整体性能。而现在,4核、8核、32核、64核和100核,都已经是真实存在的CPU芯片,如何提高多核的性能可扩展性,是一个必须面对的问题。比如让同一任务分割在多个核心上执行,以避免CPU的空闲浪费,当然,这里面要解决的技术点有任务分割、任务同步和异步等。 再次,核心缓存大小与内存速度是一个关键问题。现在,内存已经变得非常的便宜,随便一台普通的笔记本电脑,内存至少也就是4G以上,高端服务器的内存上24G那是相当的平常。但是,内存的访问速度仍然很慢,CPU访问一次内存需要约60~100纳秒,相比很久以前的内存访问速度,这基本没有增长多少。对于在一个带有1GHZ主频CPU的电脑硬件里,如果要实现10M性能,那么平均每一个包只有100纳秒,如果存在两次CPU访问内存,那么10M性能就达不到了。核心缓存,也就是CPU... [阅读更多]

Linux 3.10完整支持的DynTicks(动态定时器)特性简介

2013年7月3日 1 条评论 8,995 次浏览

一个多月没捣鼓内核了,不容易呀!之前天天查Linux内核的Down机问题,天天现在看应用层代码,还真有点不适应,不过也挺有意思的,这对于我来说,毕竟是一块新鲜地,呵呵。今晚看了一下Linux... [阅读更多]

死锁检测模块lockdep简介

2013年4月10日 没有评论 21,350 次浏览

在Linux系统里,假设有两处代码(比如不同线程的两个函数F1和F2)都要获取两个锁(分别为L1和L2),如果F1持有L1后再去获取L2,而此时恰好由F2持有L2且它也正在尝试获取L1,那么此时就是处于死锁的状态,这是一个最简单的死锁例子,也即所谓的AB-BA死锁。 死锁导致的最终结果无需多说,关于如何避免死锁在教科书上也有提到(参考1),最简单直观的做法就是按顺序上锁,以破坏死锁的环形等待条件。但对于拥有成千上万个锁的整个系统来说,完全定义它们之间的顺序是非常困难的,所以一种更可行的办法就是尽量提前发现这其中潜在的死锁风险,而不是等到最后真正出现死锁时给用户带来切实的困惑。 已有很多工具用于发现可能的死锁风险,而本文介绍的调试/检测模块lockdep,即是属于这一类工具的一种。调试模块lockdep从2006年(https://lwn.net/Articles/185666/)引入内核,经过实践验证,其对提前发现死锁起到了巨大的效果(http://lwn.net/Articles/321670/)。 官方文档(完全参考2)有介绍调试模块lockdep的设计原理,这里按照我自己的理解描述一下。 一,lockdep操作的基本单元并非单个的锁实例,而是锁类(lock-class)。比如,struct... [阅读更多]

中断栈溢出后的结果

2013年3月24日 没有评论 16,589 次浏览

说一下上文中最开始提到的“某个问题”:如果一台主机网卡比较多,然后每个网卡分队列又比较多,总之结果就是系统里的网卡设备的中断号比较多(关于超过256个中断数的情况,请见参考1,2,3),一旦所有这些中断都绑定到同一个CPU,那么如果网卡收到数据包进而触发中断,而众多硬中断一嵌套就非常容易出现中断栈溢出。一旦中断栈溢出,那么将会导致怎样的结果,这曾在之前的文章里隐含的提到过,这里再重新整理一遍。 在继续下面的描述之前,先看两个知识点: 1,Linux... [阅读更多]

对Linux x86-64架构上硬中断的重新认识

2013年3月16日 1 条评论 8,703 次浏览

对于x86硬中断的概念,一直都落在理论的认识之上,直到这两天才(因某个问题)发现Linux的实现却并非如此,这里纠正一下(注意:Linux内核源码更新太快,一个说法的时效性太短,所以需注意我提到的香草内核版本,并且以x86-64架构为基准)。 以前的认识:Linux对硬中断(本文如无特殊说明,都是指普通意义上的可屏蔽硬件中断)的处理有优先级概念,高优先级硬中断可以打断低优先级硬中断。 重新认识: 1,对于x86硬件而言,在文档325462.pdf卷3章节6.9... [阅读更多]