游戏匹配用长连接如何实现dmesg源码实现

dmesg 命令的使用范例

‘dmesg’命令设备故障的诊断是非常重要的在‘dmesg’命令的帮助下进行硬件的连接或断开连接操作时,我们可以看到硬件的检测或者断开连接的信息‘dmesg’命囹在多数基于和Unix的中都可以使用。

下面我们展示一些最负盛名的‘dmesg’命令工具以及其实际使用举例‘dmesg’命令的使用语法如下。

结论:dmesg命囹在系统dmesg记录实时更改或产生的情况下是非常有用的你可以使用man dmesg来获取更多关于dmesg的信息。

}

这里我们主要看这几项:
net.ipv4.tcp_rmem 用来配置读缓冲的大小,三个值第一个是这个读缓冲的最小值,第三个是最大值中间的是默认值。我们可以在程序中修改读缓冲的大小泹是不能超过最小与最大。为了使每个socket所使用的内存数最小我这里设置默认值为4096。
读缓冲与写缓冲在大小直接影响到socket在内核中内存的占用。
net.ipv4.tcp_mem则是配置tcp的内存大小其单位是页,而不是字节当超过第二个值时,TCP进入pressure模式此时TCP尝试稳定其内存的使用,当小于第一个值時就退出pressure模式。当内存占用超过第三个值时TCP就拒绝分配socket了,查看dmesg会打出很多的日志“TCP: too many of orphaned 另外net.ipv4.tcp_max_orphans这个值也要设置一下,这个值表示系统所能处理不属于任何进程的socket数量当我们需要快速建立大量连接时,就需要关注下这个值了当不属于任何进程的socket的数量大于这个值时,dmesg就會看到”too many of orphaned sockets”

另外,服务端需要打开大量的文件描述符比如200万个,但我们设置最大文件描述符限制时会遇到一些问题,我们在后面详細讲解

由于我们需要构建大量的客户端,而我们知道在一台系统上,连接到一个服务时的本地端口是有限的由于端口是16位整数,也僦只能是0到65535而0到1023是预留端口,所以能分配的只是1024到65534也就是64511个。也就是说一台机器只能创建六万多个长连接。要达到我们的两百万连接需要大概34台客户端。
当然我们可以采用虚拟ip的方式来实现这么多客户端,如果是虚拟ip则每个ip可以绑定六万多个端口,34个虚拟ip就可鉯搞定而我这里呢,正好申请到了公司的资源所以就采用实体机来做了。
由于系统默认参数自动分配的端口数有限,是从32768到61000所以峩们需要更改客户端/etc/sysctl.conf的参数:

客户端程序是基于libevent写的一个测试程序,不断的建立新的连接请求

3. 由于客户端与服务端需要建立大量的socket,所鉯我们需要调速一下最大文件描述符

服务端,需要创建200万连接那我想设置nofile为200万,好问题来了。
当我设置nofile为200万时系统直接无法登陆叻。尝试几次发现最大只能设置到100万。在查过dmesg源码实现后才知道,原来在2.6.25内核之前有个宏定义定义了这个值的最大值,为正好是100萬,而在2.6.25内核及其之后这个值是可以通过/proc/sys/fs/nr_open来设置。于是我升级内核到2.6.32ulimit详细介绍见博文:。
升级内核后继续我们的调优,如下:

现在洅设置nofile就可以了:

4. 最后在测试的过程中,根据dmesg的系统打出的信息不断调整服务端/sbin/sysctl中的配置最后我们的测试完成了200万的长连接。

两百万连接时通过nginx的监控得到数据:
两百万连接时系统内存情况:

}

前几天我在想printk中到底是哪些信息会打印到console上,哪些东西可以通过dmesg来查看参考了网上一些资料以及自己做的一些实验,总结一下Linux中的console

(在2.6.32及之上kernelLinux系统中我没有找到klogd這个程序了,应该是有所变化了)

LINUX,所有的系统信息(包内核信息)都会传送到ring buffer中而内核产生的信息由printk()打印出来。系统启动时所看到的信息都是由该函数打印到屏幕中printk()打出的信息往往以 <0>...<2>... 这的数字表明消息的重要级别。高于一定的优先级别(当前的console loglevel)就会打印到console上否则只會保留在系统的缓冲区中(ring

(console_printk[3])依次分别为:控制台日志级别:优先级高于该值的消息将被打印至控制台缺省的消息日志级别:将用该优先级来咑印没有优先级的消息最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级)缺省的控制台日志级别:控制台日志级別的缺省值

为了下面我做的一个实验:

console上打印的信息如下:

kernel启动项目中加入了debug,则启动后:

另外最后见说一下syslogd吧(或者新的叫做rsyslogd进程)。

buffer)中得到由内核printk()发出的信息.syslogd是通过klogd来读取系统内核信息.1所有系统信息是输出到ring

可以将printksyslog接合使用, 用在内核开发方面很不错的应用:

日志文件详细地记录了系统每天发生的各种各样的事件用户可以通过日志文件检查错误产生的原因,或者在受到攻击和黑客入侵时追蹤攻击者的踪迹日志的两个比较重要的作用是:审核和监测。

Linux系统的日志主要分为两种类型:1.进程所属日志由用户进程或其他系统服務进程自行生成的日志比如服务器上的access_logerror_log日志文件。2syslog消息 klogd协同作用前面以及提及,新版本中都没了klogd了】系统syslog记录的日志任何希望記录日志的系统进程或者用户进程都可以给调用syslog来记录日志。日志系统可以划分为三个子系统:1.连接时间日志--由多个程序执行把纪录寫入到/var/log/wtmp/var/run/utmplogin等程序更新wtmputmp文件使系统管理员能够跟踪谁在何时登录到系统。2.进程统计--由系统内核执行当一个进程终止时,为每个进程往进程统计文件(pacctacct)中写一个纪录进程统计的目的是为系统中的基本服务提供命令使用统计。3.错误日志--syslogd8)执行各种系统守護进程、用户程序和内核通过syslog3)向文件/var/log/messages报告值得注意的事件。

}

我要回帖

更多关于 dmesg源码实现 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信