DPDK mbuf何时释放回内存池

DPDK mbuf何时释放回内存池,第1张

I.

先回答第二个问题,对于多核系统,可能会存在对于mempool的并发访问,虽然DPDK实现了无锁的ring,但无锁的实现是基于CAS(Compare

And

Set),频繁的访问仍然会影响效率。所以,对于每个核,都可以在创建mempool时,选择为每个核分配Cache,这样,在对应的核上申请和释放mbuf时,就会优先从本地Cache中使用,这样,就会有一部分mbuf驻存在Cache。

II.

同样是出于效率问题,在收发包队列中可以设置长度和一些阈值,tx_free_thresh就是其中一个。具体是因为在网卡硬件读取完发包描述符后,并且DMA完成传送后,硬件会根据发送结果回写标记来通知软件发包过程完成。这样,这些发包描述符就可以释放和再次使用了,对应的mbuf也就可以释放。问题就在这里,如果每次发送完都进行释放,就可能会影响效率,这样,通过设置tx_free_thresh,只有在可以重新分配的发包描述符数量少于tx_free_thresh后,才会释放那些发送完成的描述符和mbuf。所以,可以看出,一部分mbuf驻存在网卡发送队列中。

在知道了Mbuf都被存放在哪后,就知道了何时会被重新放到Mempool。针对存在Cache的情况,可以具体参考官方文档,在Cache,ring,和Mempool的关系中可以找到答案。针对第二种在NIC

queue中的情况,则是在低于tx_free_thresh值时释放描述符和Mbuf。

linux 怎么给mysql分配内存大小

修改mysql配置文件,优化缓存大小和连接数连接方式,优化sql语句 ,记得mysql好像是有工具可以查看最占用资源的sql语句,找到他,优化他。安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境,当然需要有不同的配制文件了。

一般使用c或cpp编程时,堆栈越界访问(read/write)往往会引起很多意想不到的错误,比如延后的进程崩溃等。因此,如果有一种方法,可以让越界访问立即触发系统错误(让进程抛出异常而终止,再生成coredump文件),就可以立即检测出内存越界行为,并将对这种隐藏的错误,及时作出反应,以免在生产环境下造成更大的损失。 我们知道,在windows系统下面,我们可以使用VirtualAlloc系列函数,通过申请2页内存,并设置某页的保护参数(比如,可读,可写等),就可以实现类似的保护机制。这样,当我们对新增加的类(数据结构),就可以重载operator new/delete,将类的边界设置到一页的边缘,再将相邻页设置为不可读不可写。这样就能有效监测堆越界读写问题。而且可以,设置某个编译宏,比如PROTECT_CLASSX。演示代码如下: 在linux下,则需要借助mmap和mprotect来实现这个机制。具体步骤如下,首先用mmap使用PROT_NONE映射一个特殊文件,比如/dev/zero(或者使用MAP_ANONYMOUS),然后再用mprotect提交内存。上面的例子,可以继续使用,但是只列出来核心的代码,什么重载 *** 作符就不写了,另外,内存映射文件j句柄最好用内存池来hold,最后在close掉。演示代码只说明大致用法,并不能直接拿来用。 下面补充mprotect的用法: 再把mmap函数的用法示例如下:


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

原文地址: https://outofmemory.cn/yw/7463568.html

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

发表评论

登录后才能评论

评论列表(0条)

保存