时间片 线程切换 指令周期 流水线 TPS的初步了解

时间,线程,切换,指令,周期,流水线,tps,初步,了解 · 浏览次数 : 242

小编点评

**时间片 线程切换 指令周期** * Redis 单线程提供服务,可以支撑十万级别的TPS通过以个非常简单的测试redis-benchmark -c 50 -n 50000 ping Intel 8369HB 3.3Ghz 14万TPS阿里 倚天710 2.7Ghz 16万TPSAMD 9T34 3.4Ghz 22万TPS * 理论上 redis执行一条指令核心进程只需要 1微秒左右。 * 指令周期和流水线CPU执行一条指令的时间,可以大概的认为是指令周期。 * 2Ghz的CPU 他执行一条uop的时间可以简单理解为是 0.5纳秒。 * 虽然现在x86号称是CISC, 但是在x86CPU的指令解析和发射的部分其实是使用的RISC的技术。 * 尽管将macro的op拆解成了一个一个minor op, 看起来会导致指令使用的周期变多。但是因为流水线和多发射超标量的存在, 一个周期可以发射6-8个指名。

正文

时间片 线程切换 指令周期 流水线 TPS的初步了解


情况说明

Redis 单线程提供服务, 可以支撑十万级别的TPS
通过以个非常简单的测试
redis-benchmark -c 50 -n 50000 ping 
Intel 8369HB 3.3Ghz    14万TPS
阿里 倚天710  2.7Ghz    16万TPS
AMD 9T34     3.4Ghz    22万TPS 

可以推测, Redis执行一次ping到客户端, 在本地的情况下大概耗时
1S/20万 约等于 5微秒

认为: redis可以在 5 微秒之内 完成 客户端连接-命令执行-推送结果到客户端
如果是在不同机器上面, 那么时间差异可能会比较大一些. 因为有网络层的延迟与交互. 

想基于这个数据, 进行一些简单的分析与判断. 

CPU与操作系统时间片

在多核CPU之前,PC以及一些简单的服务器一般只有一颗CPU
这种情况下. 实现多用户,多任务的处理都是通过时间片的概念来进行. 

CPU将自己的处理时间分为一定大小的时间片,给不同的任务进行处理. 
任务之间如果时间片到了需要让出时间片, 交由其他任务进行. 

linux的发行版的时间片是20ms到800ms不等. 
时间片的让出有 主动让出, 也有被动让出.
不管哪种让出都需要考虑 线程切换, 上下文切换. 

线程切换, 进程切换, 系统调用, 中断 都会导致上线文切换.

上下文切换 需要CPU 保存当前在运行进程的TLB,以及寄存器, 指令位置等信息
等待当前任务有了时间片时在加载进内存. 

需要说明一点: 
线程切换的成本比较高. 可能需要 1000-2000个质量周期, 耗时可能有1微秒甚至更多. 

回到刚才的例子, redis 在执行时面对不同的client 可能需要进行一次上下文切换,用于返回给特定的client信息.
一进一出, 损耗可能就有 2微秒, 加上一些协议开销. 理论上 redis执行一条指令 核心进程只需要 1微秒左右. 

理论上redis可以拿到百万级别的 TPS. 但是因为各种开销, 导致可能无法达到这个上限. 

指令周期和流水线

CPU执行一条指令的时间, 可以大概的认为是指令周期.
一般2Ghz的CPU  他执行一条uop的时间可以简单理解为是 0.5纳秒.

但是需要注意的一点是: 虽然现在x86号称是CISC, 但是在x86CPU的指令解析和发射的部分其实是使用的RISC的技术.
他将复杂指令解析成一个一个微笑的 uop 才进入流水线进行调度. 

虽然将macro的op拆解成了一个一个minor op, 看起来会导致指令使用的周期变多. 
但是因为流水线和多发射超标量的存在, 一个周期可以发射6-8个指名. 并且多级流水线的存在同时运行的命令要更加多
会带来更多的性能收益. 

流水线里面将复杂的命令拆解到不通的周期中去执行. 
在遇到流水线毛线,或者是指令等待或者是冲突时, CPU会设计多种方式进行避免和提速. 

国产信创CPU可以做到多核心高频率, 但是很难在流水线和指令集并行部分达到Intel和AMD的水平, 
所以看机器的性能不能全看主频和核数, 还要看很细节的 指令流水和多发射相关信息. 

看量化分析性能的书时, 最近这些年性能的提升很多在用乱序指令集的一些优化.
Intel有几百个OOB的缓存, 可以都执行指令后统一进行排序返回和回写, 尽可能的提升性能. 

TPS

TPS = 工作线程数/响应时间
所以提高TPS的方法就是 提高工作线程数和降低响应时间.

但是提供了工作线程, 会导致上下文切换增多好耗费更多的寄存器和内存来保存线程的状态. 超过一定限度, 线程切换的成本会极具上升. 

响应时间的提高不仅可以提升客户感受还能够尽快的完成任务. 
现在我们发现, 国产设备不够优秀的地方就在于响应时间. 
他的核心数足够多, 可以实现很多线程进行工作, 但是每个线程的相应时间却比较大, 到执客户反映不好用. 

虽然很多国产CPU的主频和核心数较多, 但是他们的指令集, 流水线, 乱序,以及架构等部分不如国际厂商先进.

所以很多时候不能单纯看核心和主频,还要看厂商和型号. 

与时间片 线程切换 指令周期 流水线 TPS的初步了解相似的内容:

时间片 线程切换 指令周期 流水线 TPS的初步了解

时间片 线程切换 指令周期 流水线 TPS的初步了解 情况说明 Redis 单线程提供服务, 可以支撑十万级别的TPS 通过以个非常简单的测试 redis-benchmark -c 50 -n 50000 ping Intel 8369HB 3.3Ghz 14万TPS 阿里 倚天710 2.7Ghz

深入理解操作系统中进程与线程的区别及切换机制(下)

本文首先介绍了进程的控制结构,即进程控制块(PCB),它是表示进程的数据结构,包含了进程的相关信息和资源。PCB之间通过链表连接,形成就绪队列和阻塞队列,用于进程调度和资源管理。接着,文章详细探讨了进程的切换过程。进程切换是为了保证公平分配CPU时间片,涉及保存和恢复进程的执行上下文、更新进程状态和调度算法选择等步骤。文中还提到了进程上下文切换的场景,如时间片用完、内存不足、高优先级进程需求等。最

Java并发篇:6个必备的Java并发面试种子题目

免费体验AI绘画:https://www.topgpt.one;文章涉及了几个常见的并发编程相关的主题。首先,线程的创建和生命周期是面试中常被问及的话题,面试官可能会询问如何创建线程、线程的状态转换以及如何控制线程的执行顺序等。其次,synchronized关键字是用于实现线程同步的重要工具,面试中可能会涉及到它的使用场景以及与其他同步机制的比较。此外,抽象队列同步器(AQS)是Java并发编程中

6. 用Rust手把手编写一个wmproxy(代理,内网穿透等), 通讯协议源码解读篇

用Rust手把手编写一个wmproxy(代理,内网穿透等), 通讯协议源码解读篇 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy github: https://github.com/tickbh/wmproxy 事件模型的选取 OS线程,

[转帖]《Linux性能优化实战》笔记(四)—— CPU 使用率

一、 节拍率与CPU时间 前一篇说到,Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。 为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jif

[转帖]CPU状态信息us,sy等含义

https://www.cnblogs.com/rxysg/p/15670435.html 目录 一.概述概述 二.详解 us和sy ni id wa hi和si st 三.总结 一.概述概述 比如一秒内有100个cpu时间片,这个cpu时间片就是cpu工作的最小单位。那么这100个cpu时间片在不

[转帖]【学习笔记】Linux下CPU性能评估

Linux下CPU性能评估 1、 vmstat监控CPU使用情况 【说明】 procs: l r表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU的个数,就说明CPU不足,需要增加CPU。 l b表示在等待资源的进程数,比如正在等待I/O或者内存交换等。 memory: l swpd:

进程调度的原理和算法探析

本文探讨了进程调度的原理和算法,并提供了全面的概述。进程调度是操作系统中的重要组成部分,用于决定进程的执行顺序和分配CPU时间。我们讨论了优先级调度和时间片轮转调度算法。优先级调度根据进程的优先级确定执行顺序,可以分为抢占式和非抢占式。时间片轮转调度将CPU时间划分为固定大小的时间片,每个进程在一个时间片内执行。合理设置时间片长度能够避免资源浪费和频繁的上下文切换。最短作业优先和最短剩余时间优先是

python入门基础(15)--模块和python中数学、日期、时间类模块。

接上篇,当我们创建了很多类,比如 图书馆里的藏书,分社会科学类,艺术类、生活类、农业类、工业类等,而工业类又分为轻工业、重工业、信息工业,然后再细分。当分的越来越细时,程序就会越来越大。如何管理,便成了程序开发过程中一个重要的环节。于是可以按照图书馆分类管理的思想,对程序代码进行管理。 将一个应用程

第124篇: 期约Promise基本方法

好家伙,本篇为《JS高级程序设计》第十章“期约与异步函数”学习笔记 1.异步编程 同步行为和异步行为的对立统一是计算机科学的一个基本概念。 特别是在 JavaScript 这种单线程事 件循环模型中,同步操作与异步操作更是代码所要依赖的核心机制。 异步行为是为了优化因计算量大而 时间长的操作。如果在