内容简介:全文完极度欢迎将文章分享到朋友圈长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~
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%。
而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搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 用机器学习改善网络通话质量
- React16性能改善的原理一
- 使用 GPU.js 改善 JavaScript 性能
- AI和机器学习如何改善客户体验
- [译] 改善 React 应用性能的 5 个建议
- Firefox 87.0 发布,进一步改善隐私
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Charlotte's Web
E. B. White / Puffin Classics / 2010-6-3 / GBP 6.99
This is the story of a little girl named Fern who loved a little pig named Wilbur and of Wilbur's dear friend, Charlotte A. Cavatica, a beautiful large grey spider. With the unlikely help of Templeton......一起来看看 《Charlotte's Web》 这本书的介绍吧!
Base64 编码/解码
Base64 编码/解码
XML 在线格式化
在线 XML 格式化压缩工具