如何写一个Web服务器

如何写一个Web服务器,第1张

针对web服务器:首先你要去了解>日志系统设计需要考虑的问题:

1需要保证日志系统收集到的数据的有效性和完整性,在app崩溃时日志不丢失。

2保证收集日志的过程不影响app的性能,不能占用过高cpu资源,或者频繁IO造成卡顿现象。

简单来说,日志收集就是把app运行过程中产生的一些关键数据,给他采集保存起来,然后上传到后台服务器的过程。

这个采集过程,如果是每产生一次日志数据,就写一次文件,势必造成系统IO调用的频繁 *** 作,可能会造成app运行卡顿现象。

MMAP就非常适用于解决这个问题。

MMAP是什么?

MMAP是一种内存映射文件的方法,将文件或者一些对象映射到进程的地址空间。实现文件磁盘地址跟进程虚拟地址空间中的一段内存空间一一映射关系。在写入进程的这段映射内存后,进程内存页的脏数据会自动回写到文件磁盘空间,这就以写内存的效果来实现了写文件的目的。

使用MMAP进行写日志,不仅解决了逐条日志写文件造成的频繁IO卡顿问题,而且也保证了日志数据的完整性,因为在app崩溃的时候,MMAP写入的映射内存数据也会被 *** 作系统自动回写到文件磁盘空间,所以MMAP确实是高效日志系统的首选。

微信的XLog,美团的Logan都是用的MMAP。

还有另一个问题,如何对日志内容进行压缩,以达到写日志更加高效?

微信的XLog的方案是每产生一条日志,就进行压缩并写一次MMAP,压缩算法是LZ77压缩(基于字典的压缩算法),压缩率可达837%。

美团的Logan采用的是流式Gzip压缩方式,每次以16kb为单位,通过z_stream将日志流式进行Gzip压缩,流式可以避免CPU峰值。当然这种方案有个缺点,就是没有完美的解决日志丢失问题,当app发生Crash,有可能丢失尚未写入MMAP的16kb的日志。

用工具解决!\x0d\ RamMap用于展示系统和进程内存状态和利用率。它提供一个命名为“使用计数”的概要栏,它列出所有各种各样的系统内存分区,如分页池和非分页池、流程私密的、可共享的、硬盘空间、内核堆栈和映射文件。它还显示被称为Metafile的缓存文件内存空间的数量。\x0d\ 如果你要解决的内存问题看起来和特定的进程或应用相关,你也许有必要通过使用VMMap来仔细看看。VMMap是一个过程导向的工具,它让你可以查看现有的进程或者追踪新的进程并查看其内存使用,它提供的信息远比RamMap详细。\x0d\VMMap启动时,它提示你选择你想要审查的现在进程或是开启一个新的进程。如果你启动了一个新进程,你将能追踪内存利用率,如堆和虚拟分配。

服务器上部署了ES5集群,通过zabbix监控发现cpu load呈锯齿状,且ES所在磁盘iops read和cpu load有一样的锯齿,可证明ES周期性的发生大量读磁盘 *** 作。通过分析,ES周期性大量读磁盘是因为QA每10分钟发起搜索业务请求
此外,该机器上有marathon超卖内存的情况存在,当关闭超卖的服务时,iops read及cpu load监控正常

按理说QA监控发起的搜索请求不会变化,ES应该有索引文件缓存。所以首先分析ES索引文件缓存的情况
通过/proc/$pid/smaps可查看进程内存分布及映射情况,如下图所示,size表示通过mmap映射的文件的大小,Rss表示该文件mmap实际内存的大小,Pss表示当某个文件被多个进程同时使用时,平均每个进程占用的内存大小

写个脚本,分析一下文件缓存使用情况:

索引5s96iIBfS6KivdgDrb8u-Q映射文件大小为443g,实际占用物理内存838M,对比其他服务器同索引文件缓存使用情况发现,大于该机器占用的物理内存(21g 对比 838M)
通过监控ES进程的smaps文件发现当cpu飙升即搜索请求时,文件缓存占用高达2-3G,请求完成一段时间后文件缓存将至700-800M,此时可判定是因为文件缓存被系统踢掉导致频繁发生磁盘io
通过分析源码可知ES使用MMapDirectory打开索引文件,其内部FileProvider调用C库的mmap函数打开文件,所以是由系统托管文件缓存
为何 *** 作系统会踢掉ES文件缓存?猜测是因为marathon超卖导致内存使用过多, *** 作系统需要回收文件缓存,而QA监控又是10分钟请求一次,导致ES无法持有文件缓存

通过调整 *** 作系统内核参数vmvfs_cache_pressure(100 => 80)来让 *** 作系统尽量少回收文件缓存,调整后相关监控如下

ES节点内存维持较之前提升至少500M

通过监控分析smaps文件能获取各索引文件物理内存占用情况,发生堆外内存异常时可排查是哪些索引文件导致的,即可大致推断是什么业务什么类型的查询
heap内存可以使用jhat、jmap分析使用情况
匿名页缓存可在jvm启动参数加上-XX:NativeMemoryTracking=[off|summary|detail]后,通过jcmd $pid VMnative_memory detail分析


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13432527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-05
下一篇 2023-08-05

发表评论

登录后才能评论

评论列表(0条)

保存