techdoc centre
本站搜索 用户名: 密码:
   HOME  TECHDOC  WEB  SDK  NSDT  TOPIC  BIZDOC   LOGIN
  发布地区 Global 发布类别 TECHDOC Programming High-capability
字体:
  LINUX下提高性能的三个系统调用
于 2017-11-28 编辑: Eric 查看: 603 次   Article Url Print this page

熟悉Linux内核2.4版本的也许知道:在2.4版的内核中内嵌了一个叫做khttpd的静态网页服务器。当时,可能是效率的因素致使她被添加了进来,至于为什么最新的2.6版内核去掉了这个服务器,我考虑可能是因为Linux内核“只提供机制,而不提供策略”,当然安全因素也不能排除在外。

实际上,把网页服务器做进内核也是完全没有必要的,因为Linux内核提供了sendfile这样一个系统调用:

#include <sys/sendfile.h>

    ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

她能把一个文件从特定部分开始的特定块通过一个socket发送出去,从而避免了多次调用read和write的内核上下文和用户上下文切换的开销,并且由于其内部实现利用了mmap技术,也减少了内存的复制开销。有了她,请问khttpd还有那么必要么?

splice和tee是2.6.17版的Linux内核首次引入的:

#define _GNU_SOURCE
    #include <fcntl.h>

    long splice(int fd_in, off_t *off_in, int fd_out,
          off_t *off_out, size_t len, unsigned int flags);

#define _GNU_SOURCE
    #include <fcntl.h>

    long tee(int fd_in, int fd_out, size_t len, unsigned int flags);

这两个主要用来减少管道和其他描述符之间传递数据时的read和write系统调用的数目,详细用法请查看man页,其中tee的man页中还给出了采用splice和tee重新实现的一个tee命令作为示例,如有兴趣,可查看一下。

与他们一同引入的还有vmsplice:

#define _GNU_SOURCE
    #include <fcntl.h>
    #include <sys/uio.h>

    long vmsplice(int fd, const struct iovec *iov,
           unsigned long nr_segs, unsigned int flags);

这个系统调用将用户空间的内存映射到内核空间,从而避免了实际的内存写操作,提高了系统效率。

不过,我并没有觉得splice,tee和vmsplice在实际的代码中很“有用”,倒是觉得如果能去除对管道的限制更好些。因为隧道型的代理服务程序,在连接建立后,剩下的主要任务就是在两个socket之间互相relay数据,如果能把他们splice起来,还是能在一定程度上提高效率的。呵呵,众口难调!

希望以上介绍对大家有益!

http://www.yuanma.org/data/2007/0130/article_2205.htm


相关文章:

o 我所熟悉的网站负载均衡技术
o libevent源码分析
o Epoll & Select性能比较测试
o 高性能服务器设计
o 提高 Linux 上 socket 性能
o 促进高效数据传输的TCP/IP选项
o 使用sendfile()让传输得到最优化
o The C10K problem
o 可伸缩的网络编程(Scalable Network Programming)
o 提高 Linux 上 socket 性能


   Search:

   

   Categories:

 Open All Close


Copyright techdoc.netsoftlab.ca powered by netsoft lab. 2007-2012  
Friend Websites:   netsoftlab.ca   cnstar.ca   CS lessions