热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LWN:改善fget()的performance

全文完极度欢迎将文章分享到朋友圈长按下面二维码关注:LinuxNews搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

Improving fget() performance

By Jake Edge

May 6, 2019

LSFMM

在2019 Linux Storage, Filesystem, and Memory-Management Summit上,Dave Watson提出了一个讨论话题,关于fget()函数的performance。fget()会获取一个文件的struct file指针,reference count加一。用完后,可以通过fput()来释放reference。Watson最近在Facebook的performance分析中,发现这个函数占用了挺多的CPU时间,他分享了一下自己的发现。

在Facebook运行一些service的服务器上,fget()和fput()占用了将近3%的CPU。有一次他看到内部服务占用了2.9%,而 Memcached 的分布式key-value存储服务占用了2%,mcrouter占用了1.7%,其他service一般在0.3%到0.9%。

他起初觉得用这么多CPU时间来做reference count引用计数的维护,也太多了吧。不过后来他发现受到影响的service主要都是networking service,所以他猜测可能是network stack这边导致这个问题的。于是他仔细钻研了一下Memcached,发现fget()和fput()所占用的CPU时间中, 72.5%的时间都是起源于recvfrom() system call。其他还有2个syscall也用了不少fget()时间,分别是epoll_pwait()占了11.5%,sendmsg()占了11%。

LWN: 改善fget()的performance

而Memcached是一个call-response service,也就是说它受到一个request之后,会发送对应的response回去。而sendmsg()就跟recvfrom()被调用的次数是一样多的,却没有出现类似的问题。所以他比较怀疑是receive这条通路上发生了不少cache miss,而send是在这之后紧跟着发生的,因此cache miss发生的更少。

仔细分析fget()之后,发现cache miss来自file-descriptor table,在释放struct file指针的时候,会花费很多CPU时间,还有在atomic increase这个reference count的时候也一样。于是他相应的想了2个方法来改善。首先是针对有些system call,只用了一个file descriptor的话,在fget()的时候先不增长reference count(相应的在fput()的时候也先不减少reference count),例如recvfrom(),sendmsg(),各种epoll*(),都是这个类型的。这样,函数调用的时候一般就不会被阻塞在那里了,不过如果仍然阻塞了的话,就走回原来的处理逻辑。简单实现了一下之后,他发现测试结果不是太理想,所以他就放弃了这条路。

第二个方向,是给struct file的指针创建一个per-task的cache,这样来减少cache miss。在file-descriptor table里面有很多file指针是公用同一个cache line的,只要其中一个指针被某个其他进程改了,整个cache line都会受到影响。Facebook的应用场景里,file descriptor会一直归属于各自的处理线程,所以这个方案能解决Facebook的问题。当然这不是一个official的方案,但是他想先测测有没有想过。不过,还要注意,如果需要close()能正常完成的话,就需要及时flush cache。最后他在struct file里面加了一个指针指向per-task cache entry,这样close()就能正确利用这个信息了。

最终,他的试验证明有效,大多数cache miss的性能损失都不再存在了。系统的performance基本上有2倍的增长。他还没有想好怎么处理struct file dereference的时候的cache miss,应该是下一步了。

Jan Kara担心这里的file-descriptor table问题,是否能通过更改file descriptor的分配方式来解决。就是用不同的thread来分配table里的不同部分。有些application依赖一个排好序的file-descriptor allocation,这种情况就没法支持好了。不过确实这个idea对减少cache line的反复替换还是有帮助的。Matthew Wilcox建议这里可以利用dup2()来达到这个效果。

Wilcox还建议这个改动应该是基于进程的,而不是基于线程的。而Facebook的service的设计也可以再考虑一下这个底层特性,来改善这个问题。Watson回答Facebook service很难改了,不过Jan Kara提出的per-thread file-descriptor range还是值得一试的。

全文完

极度欢迎将文章分享到朋友圈 

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

LWN: 改善fget()的performance


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
author-avatar
沈晓燕-东东
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有