再谈高性能Web服务器,MemoryPool的作用
在以往使用c#实现scoket服务器中,通常遇到一个问题就是内存占用高,GC次数频繁,导致处理能力直线下降
其主要原因是在处理socket请求时,大量的申请,复制内存,为了解决这个问题,NET Core 2.1引入了Span<T>,Memory<T>,MemoryPool<T>操作类型
其主要目的是能够像c/c++一样,使用指针去访问,释放内存,提供一种高性能,可复用的内存处理方式
在Kestrel 2.1中,就使用了Span<T>,Memory<T>,MemoryPool<T>处理socket请求,这也是Kestrel 2.1性能强大的原因之一
MemoryPool是一个抽象类,提供了以下几个方法供使用
public static MemoryPool<T> Shared { get; } //获取全局共享的默认内存池
public abstract int MaxBufferSize { get; } //每次可获取的最大内存大小
public void Dispose(); //释放内存池,申请的内存也一并释放
public abstract IMemoryOwner<T> Rent(int minBufferSize = -); //申请一个内存块,可以指定最小大小,默认为-1自动分配
protected abstract void Dispose(bool disposing);
申请到内存块 IMemoryOwner<T> 后,可以通过该接口获取Memory<T>, Memory<T>其实就是Span<T>的工厂
Span<T>的操作方式以及性能跟Array<T>差不多,它是一种内存视图的表达方式,包含了目标内存的开始位置,内存长度
我们操作的Span<T>时,首先将index加上start位置,然后再从对应的Memory<T>的位置获取数据
Memory<T>与Span<T>都是struct类型,jit编译后,其对应真实的内存块,其读取也是通过内存指针直接操作,性能上跟c/c++是一样的
Memory<T>在释放后将会return回MemoryPool中,MemoryPool将会重新分配内存块,实现内存的复用
所以NET Core 2.1的Memory<T>与Span<T>类型,非常适合开发高性能Web服务器,游戏服务器
再谈高性能Web服务器,MemoryPool的作用的更多相关文章
- 高性能Web服务器Nginx
高性能Web服务器Nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强 ...
- 高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式
通过<高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景>一文,我们知道Nginx从Memcached读取数据的方式,如果命中,那么效率 ...
- nginx高性能WEB服务器系列之四配置文件详解
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- NGINX高性能Web服务器详解(读书笔记)
原文地址:NGINX高性能Web服务器详解(读书笔记) 作者:夏寥寥 第4章 Nginx服务器的高级配置 4.1 针对IPv4的内核7个参数的配置优化 说明:我们可以将这些内核参数的值追加到Linu ...
- 分享关于搭建高性能WEB服务器的一篇文章
这篇文章主要介绍了Centos5.4+Nginx-0.8.50+UWSGI-0.9.6.2+Django-1.2.3搭建高性能WEB服务器的相关资料,需要的朋友可以参考下(http://m.0813s ...
- 高性能web服务器(热死你)Resin Linux的安装、配置、部署,性能远超Nginx支持Java、PHP等
高性能web服务器(热死你)Resin Linux的安装.配置.部署,性能远超Nginx支持Java.PHP等 一. 安装resin 1. 下载resin: 下载地址:http://cauch ...
- 《Nginx高性能Web服务器》系列分享专栏
<Nginx高性能Web服务器>系列分享专栏 [作者:Poechant] Nginx是目前最流行的基于BSD-like协议.轻量级.高性能的HTTP服务器.反向代理服务器和电子邮件(SMT ...
- 高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用指令
1. error_log 含义:指定存储错误日志的文件 语法:error_log <file> [debug|info|notice|warn|error|crit] 缺省:${prefi ...
- nginx高性能WEB服务器系列之九--nginx运维故障日常解决方案
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
随机推荐
- main.cpp
/*main.cpp * *The starting point of the network simulator *-Include all network header files *-initi ...
- s5-14 链路状态路由选择
为什么DV逐渐让位于LS? DV 站的不高,看得不远 完全相信邻居 LS 想办法站得高,看更远 多高.多远? 怎么做? 链路状态路由(Link State) 主要思想 发现 它的邻 ...
- 张奎师弟参与devexpress chartControl绘图--解决了devexpress的chartControl控件不能添加系列的问题
using DevExpress.XtraCharts; using System; using System.Collections.Generic; using System.ComponentM ...
- python_day1_python第一个程序 hello world
Python 第一个程序 1)安装好python后,cmd进入DOS下,直接输入python Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06 ...
- 20155205 2016-2017-2 《Java程序设计》第9周学习总结
20155205 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC简介 厂商在实现JDBC驱动程序时,依方式可将驱动程序分为四种类型: JD ...
- winSockets编程(二)socket函数
初始化DLL之后,接着创建套接字,通过socket()和WSASocket()函数实现此功能. SOCKET socket( int af, int type, int protocol ); af: ...
- 位图bitbucket
问题:假设有500w条数据,数据是在2^32-1的范围内,数据重复,如何减少内存对数字进行统计呢? 如果用字典来标记数字是否已经统计过来,数字做为key, value仅为0 or1,那么这样需要消耗 ...
- Libre Office超链接单元格
使用Numbers想实现MS Office中的超链接单元格功能,在网上找了半天,发现没有此功能.伤心.. MAC中安装Libre Office 打开表格类文档 选择需要超链接的单元格,选择“Inser ...
- NLP生成论文
论文框架 内容 注:既要有引用,又不能完全引用,是在前人基础上更进一步.
- (求凹包) Bicycle Race (CF 659D) 简单题
http://codeforces.com/contest/659/problem/D Maria participates in a bicycle race. The speedway t ...