【问题标题】:Boost Asio On Linux Not Using Epoll在不使用 Epoll 的 Linux 上提升 Asio
【发布时间】:2010-06-23 23:31:20
【问题描述】:

我的印象是 boost::asio 默认会使用 epoll 设置而不是 select 实现,但是在运行了一些测试之后,我的设置似乎正在使用 select。

操作系统:RHEL 4
内核:2.6
海合会:3.4.6

我编写了一个小测试程序来验证正在使用哪个反应器头,看起来它使用的是选择反应器而不是 epoll 反应器。

#include <boost/asio.hpp>

#include <string>
#include <iostream>

std::string output;

#if defined(BOOST_ASIO_EPOLL_REACTOR_HPP)

int main(void)
{
    std::cout << "you have epoll enabled." << std::endl;
}

#elif defined(BOOST_ASIO_DETAIL_SELECT_REACTOR_HPP)

int main(void)
{
    std::cout << "you have select enabled." << std::endl;
}

#else

int main(void)
{
    std::cout << "this shit is confusing." << std::endl;
}


#endif

我做错了什么?

【问题讨论】:

    标签: c++ linux boost boost-asio epoll


    【解决方案1】:

    您的程序也为我说“选择”,但 asio 正在使用 epoll_wait(),正如 ps -Teo tid,wchan:25,comm 报告的那样。

    怎么样

    #include <iostream>
    #include <string>
    #include <boost/asio.hpp>
    int main()
    {
    std::string output;
    #if defined(BOOST_ASIO_HAS_IOCP)
      output = "iocp" ;
    #elif defined(BOOST_ASIO_HAS_EPOLL)
      output = "epoll" ;
    #elif defined(BOOST_ASIO_HAS_KQUEUE)
      output = "kqueue" ;
    #elif defined(BOOST_ASIO_HAS_DEV_POLL)
      output = "/dev/poll" ;
    #else
      output = "select" ;
    #endif
        std::cout << output << std::endl;
    }
    

    (从/usr/include/boost/asio/serial_port_service.hpp抓取的ifdefs之梯)

    【讨论】:

    • 此代码为我打印了“选择”。在对 epoll_reactor_fwd.hpp 进行一些挖掘和更多测试之后,LINUX_VERSION_CODE 返回的版本低于 2.4.45(显然,这是使用 epoll 所必需的)。 uname -r 返回以下内容: $uname -r 2.6.9-78.0.13.ELsmp 如果在 epoll_reactor_fwd.hpp 中使用所需的内核,我可以让您的程序输出“epoll”。这是某种服务器配置错误吗?
    • 确实如此。我的开发系统将 LINUX_VERSION_CODE 输出为 132639 或 KERNEL_VERSION (2,6,31)(它是随 2.6.31.5 一起提供的——它是一个 OpenSUSE)。如果你从源代码重建 boost 会发生什么?
    • Boost.Asio 只是标题,我怀疑重建 boost 会有所帮助。
    • 再看一下:LINUX_VERSION_CODE 是在 /usr/include/linux/version.h 中定义的——也许服务器只是安装了错误的内核头文件。
    • 更改 /usr/include/linux/version.h 中的适当值后,asio 似乎正在使用 epoll。我有点担心调整这些值会产生其他副作用,但暂时还可以。尽管 asio 仅是标头,但我可能会重建 boost。它确实需要 boost::system 库,因此可能会潜伏一些不好的东西。谢谢大家的帮助。
    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多