小编use*_*101的帖子

为什么copy_to_user要花几百毫秒?

我有一些运行apache trafficserver的linux服务器,发现大约1/20的请求需要几毫秒,这比预期的要长得多(应该是1-2ms).

在通过systemtap进行跟踪之后,我发现在linux内核copy_to_user()调用中花费了大量时间.(ACCEPT-> inet_csk_accept-> move_addr_to_user-> copy_to_user)

服务器负载退出低(<100qps),copy_to_user()只复制16字节的数据(struct sockaddr),但花费数百毫秒.

由于我不再使用systemtap和内核跟踪技术,我无法进一步调查原因.我检查了cpu使用情况,交换使用情况

谢谢你的建议.

硬件:

  • cpu:Intel(R)Xeon(R)CPU E5-2640 v3 @ 2.60GHz
  • 记忆:64G
  • 盘:11*6T硬盘

软件:

  • centos6 2.6.32-696.el6.x86_64#1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
  • apache trafficserver 5.3.2配置10G ram
  • nginx 1.10.2,代理用户对trafficserver的请求

    // systemtap
    probe kernel.function("move_addr_to_user")
    {
        ts["move_addr_to_user", pid()] = gettimeofday_ms()
    }
    
    probe kernel.function("move_addr_to_user").return
    {
        printf("[%d]move_addr_to_user done:%d %s %d\n", gettimeofday_ms(), pid(), execname(), gettimeofday_ms()-ts["move_addr_to_user", pid()])
    }
    
    probe kernel.function("copy_to_user")
    {
        ts["copy_to_user", pid()] = gettimeofday_ms()
    }
    
    probe kernel.function("copy_to_user").return
    {
        printf("[%d]copy_to_user done:%d %s %d %d\n", gettimeofday_ms(), pid(), …
    Run Code Online (Sandbox Code Playgroud)

c++ linux linux-kernel systemtap apache-traffic-server

5
推荐指数
1
解决办法
428
查看次数