美文网首页
当系统调用变为瓶颈

当系统调用变为瓶颈

作者: 谭英智 | 来源:发表于2024-05-14 22:30 被阅读0次

当程序在操作文件,网络传输时,都会发生系统调用

系统调用会让线程切换用户态和内核态,并且当系统调用长时间没返回,会导致线程阻塞,并无法处理其他事情

system call latency

下图是getpid在发生系统调用时和不使用系统调用时的latency对比。

syscall.PNG

可以看到带system call 的 getpid latency是200ns

不带system call 的 getpid latency是8.7ns

相差20倍

write system call latency

通过下面的benchmark数据可以看到

latency在3us左右

writev_t1k reported mean: 6.17776
 500: mean 6.018us median 6us
1000: mean 5.172us median 5us
1500: mean 5.048us median 5us
2000: mean 3.918us median 4us

writev_t1k reported mean: 5.64197
 500: mean 6.254us median 6us
1000: mean 5.038us median 6us
1500: mean 3.526us median 4us
2000: mean 3.608us median 4us

writev_t1k reported mean: 4.33704
 500: mean 3.528us median 3us
1000: mean 3.486us median 3us
1500: mean 3.518us median 3us
2000: mean 3.492us median 3us

换句话说,当程序在调用系统调用write时,程序会停顿3us,并无法处理其实事情

一个可能的解决方案 io_uring?

io_uring是内核5.9以上才会有

一般来说,目前广泛使用的linux版本一般比这低

而且 io_uring在处理stream mode时,性能不如epoll

为了解决这些问题,提出以下解决方案:

  • 编写自定义内核模块

    • 在内核建立epoll对fd的监控

    • 在内核启动线程,做fd polling和polling来自用户态的数据

    • 建立一片共享内存,与用户态公用,并在共享内存上,建立单读单写无锁队列

    • 对fd的读写消息,通过共享内存返回ack给用户态

  • 用户态程序

    • 获取共享内存,并处理共享内存上队列的请求

    • 单线程polling无锁队列,实现与内核线程的交互

    • 获取共享内存中的ack,来做限流操作

相关文章

  • Hystrix

    A 系统调用 B 系统服务,B 系统调用 C 系统的服务。当尾部应用 C 发生故障而系统 B 没有服务降级时候可能...

  • Http连接池之:Timeout waiting for con

    背景 系统 A 调用系统 B 的接口,最近发现当 B 停机维护时,系统 A 在出发到调用系统 B 的接口的功能时会...

  • 检查进程的存在的几种方式

    wait()系统调用.当调用进程的任意子进程终止时,会返回,由此可判断子进程是否终止.wait系统调用存在以下几个...

  • 三、开启充电-Remote Start Transaction

    一、使用场景 Remote Start Transaction是提供给业务系统调用设备充电的接口,当业务系统调用后...

  • 「React Native」死循环 Update 界面问题

    问题描述 当调用方法:this.setState({...}) 时,系统内部会调用 render() 方法,ren...

  • 消息传递和消息转发

    当调用一个方法 run 之后 oc方法会转变为objc_msgSend(id theReceiver, SEL s...

  • linux性能分析小技巧

    分析系统瓶颈系统响应变慢,首先得定位大致的问题出在哪里,是IO瓶颈、CPU瓶颈、内存瓶颈还是程序导致的系统问题; ...

  • ios基本线条绘制

    /* 作用:专门用来绘图 什么时候调用:系统自动调用,当View显示的时候调用 param rect:当前view...

  • 活过

    当灵魂变为身体, 当身体变为躯体, 当躯体变为肉体, 当肉体变为尸体, 当尸体腐烂再度化为灵魂, 经过的, 只有若...

  • 【约束理论:聚焦五步骤】

    步骤零: 明确化你的系统目标是什么 步骤一: 纠出系统瓶颈 步骤二: 榨干系统瓶颈 步骤三: 迁就系统瓶颈 步骤四...

网友评论

      本文标题:当系统调用变为瓶颈

      本文链接:https://www.haomeiwen.com/subject/mocvfjtx.html