加入收藏 | 设为首页 | 会员中心 | 我要投稿 长春站长网 (https://www.0431zz.com.cn/)- 媒体智能、开发者工具、运维、低代码、办公协同!
当前位置: 首页 > 站长资讯 > 动态 > 正文

智能物品将重塑电子真相

发布时间:2021-02-04 16:28:52 所属栏目:动态 来源:互联网
导读:对于内存碎片率,一般保持在 1~1.5 之间是最合理的。 什么是内存碎片 了解了内存碎片率,那什么是内存碎片呢? 定义是这样的 :由于一块连续空闲的空间比所要申请的空间小,导致这块空间不可用,对于内存整体来说就是内存碎片。 举个例子: 假设有一块 100MB

对于内存碎片率,一般保持在 1~1.5 之间是最合理的。

什么是内存碎片

了解了内存碎片率,那什么是内存碎片呢?

定义是这样的:由于一块连续空闲的空间比所要申请的空间小,导致这块空间不可用,对于内存整体来说就是内存碎片。

举个例子:

假设有一块 100MB 的连续空闲内存空间,你每次都会从中申请一块 30MB 的内存。那么当你申请了 3 次后,这块内存就只剩下了 10MB 的空间,第 4 次申请的时候就会失败。如果没有其它的空间释放并且每次申请的空间都比 10MB 大,那么剩下的空间对于整块内存来说就是内存碎片。
 

查看内存使用情况

首先想要知道 Redis 内存的使用情况,我们就需要获取相关的信息。

Redis 中查看内存相关信息是很简单的,只需要在命令行输入『info memory』就可以看到各种相关数据。在这里我罗列了一些较为重要的参数:

  • used_memory:已经使用了的内存大小。
  • used_memory_rss:redis 物理内存的大小。
  • mem_fragmentation_ratio:内存碎片率。

这里有一个内存碎片率的名词需要关注下,它可以用来表示当前的内存使用情况。

具体计算方式:
 

epoll的两种触发模式

epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式(只支持no-block socket)

  • LT(水平触发)模式下,只要这个文件描述符还有数据可读,每次epoll_wait都会触发它的读事件
  • ET(边缘触发)模式下,检测到有I/O事件时,通过 epoll_wait 调用会得到有事件通知的文件描述符,对于文件描述符,如可读,则必须将该文件描述符一直读到空(或者返回EWOULDBLOCK),否则下次的epoll_wait不会触发该事件

epoll相比select的优点

解决select三个缺点

  • 对于第一个缺点:epoll的解决方案在epoll_ctl函数中。每次注册新的事件到epoll句柄中时(在epoll_ctl中指定EPOLL_CTL_ADD),会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝。epoll保证了每个fd在整个过程中只会拷贝一次(epoll_wait不需要复制)
  • 对于第二个缺点:epoll为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表。epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪的fd(不需要遍历)
  • 对于第三个缺点:epoll没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,一般来说这个数目和系统内存关系很大

epoll的高性能

  • epoll使用了红黑树来保存需要监听的文件描述符事件,epoll_ctl增删改操作快速
  • epoll不需要遍历就能获取就绪fd,直接返回就绪链表即可
  • linux2.6 之后使用了mmap技术,数据不在需要从内核复制到用户空间,零拷贝

关于epoll的IO模型是同步异步的疑问

概念定义

  • 同步I/O操作:导致请求进程阻塞,直到I/O操作完成
  • 异步I/O操作:不导致请求进程阻塞,异步只用处理I/O操作完成后的通知,并不主动读写数据,由系统内核完成数据的读写
  • 阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待

异步IO的概念是要求无阻塞I/O调用。前面有介绍到I/O操作分两阶段:R1等待数据准备好。R2从内核到进程拷贝数据。虽然epoll在2.6内核之后采用mmap机制,使得其在R2阶段不需要复制,但是它在R1还是阻塞的。因此归类到同步IO

(编辑:长春站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读