问个编码问题。。。多核。。多线程。。。之间的关系?

  • l
    linlance2000
    做运维做成码农狗了。。。累死我鸟,每天半夜回家。。哎。。。

    以前多线程弄的少,现在不得不弄了,不然回家更晚。。。

    普通CPU双核,比如 i7-3610QM @2.30Ghz

    2020-11-22_204042.png

    如图这种,是8核?那线程数是红圈内的?

    那我写多线程程序的时候,到底开多少线程比较合适?

    顺带着数据库连接池是5线程默认,因为多线程读写,一般比自己开的线程数大就好了?

    例如:
    1、程序里开20个线程的线程池,数据库的连接池里的连接线程最好超过20?比如30,40?
    2、不然就会有线程读写冲突的问题。。

    谁给讲讲?我有点头晕。。。

    我现在需要的是从硬件串到软件到数据库,一气呵成。。。

    硬件CPU,核心数,操作系统里的线程数,软件里的线程池,线程数,数据库连接数,连接池的连接数。。
  • 我好像是小号
    两千哥我也不会iOS fly ~
  • 5
    5452
    回复1#linlance2000
    数据库连接池和线程池不一样吧 iOS fly ~
  • p
    peng123456
    怀疑是不是码农。
  • B
    Blue天涯
    多核 硬件概念。多线程,软件概念。
  • 挺能说的
    二千哥,你不是马上要离职吗?管他干甚
  • C
    Crack990
    半路出家的码农?
  • R
    ResetLife
    最近刚好折腾了多进程和多线程,比较粗浅,解释不清楚,多线程的话需要用到锁,多进程可以有效里用多核CPU
  • k
    kingdehu
    process thread iOS fly ~
  • p
    pas_dts
    我上次说他的技术能力比不上毕业生,他还很不服气
  • 木鱼虫
    一个是硬件概念,一个核心两个超线程!另外一个线程是操作系统的概念
  • l
    linlance2000
    (⊙o⊙)…,嗯服气了,服气了。。。


    我觉得我半桶水,写出来程序能用,但是当初就是这两块没搞懂,所以会报错,现在好了,因为就是我说的原因,
    我把数据库连接池里的max_worker弄大了,比多线程的池里的线程多了,就不报错了。。

    但是我想把这块知识点总结总结,完全弄清楚。
  • I
    IAmThrilling
    x线程数量要看线程等待时间和cpu使用时间,也有很大程度依赖代码管理线程写的好不好,但是一般性能调优都是测出来的,简单说就是看指标找出瓶颈
  • l
    linlance2000
    我也是最近公司在用到的多线程这里,才弄弄,我知道要锁,程序也完全测试通过了,但是这块有点云里雾里,感觉不清楚。

    多进程里面有多线程,但是我想知道的CPU的多核,线程数,程序代码线程池里的线程数,数据库连接池里的线程数,这四者之间的关系。




    谢谢指点,我也是这么弄的,一开始上个l离职的人写的代码里开了上百的线程,然后连接数据库报错没有显示出来,不知道原因在哪里。。
    我跑去看了下,才发现这里面的问题。。。

    把多线程那块重新写了一下,但是发现数据库的连接池,默认就5个,扩大到40个,之后就没问题了,我程序里面的线程池里面只有20个线程,效率上来了。

    所以想总结下,这块知识点。。。
  • l
    linlance2000
    我想知道的CPU的多核,线程数,程序代码线程池里的线程数,数据库连接池里的线程数,这四者之间的关系。

    麻烦给串一下哈。。。

    CPU有两个核心,一个核心有两个超线程,程序开多少线程比较合适?比如大约需要同时进行500个左右的任务。。
  • l
    linlance2000
    不是,多年没写多线程部分的代码了,忘光了,还给老师了,虽然实践出来能用的程序,但是这块概念没有完全搞懂。




    麻烦给串讲下??:)谢谢。。



    我感觉这块在哪里都有实用价值,将来也用的上,知识薄弱点,趁机搞清楚也挺好的。。。
  • 木鱼虫
    回复15#linlance2000

    我先喂奶,明天给您转一篇文章
  • l
    linlance2000
    一起学习哈~~~:)
  • l
    linlance2000
    先谢谢哈。。网上其实我也搜了半天,这块没讲透彻,看了不少文章了,
    多进程,多线程,锁,信号之类的。。。

    但是我现在需要的是从硬件串到软件这里,一气呵成。。

    硬件CPU,核心数,操作系统里的线程数,软件里的线程池,线程数,数据库连接数,连接池的连接数。。

    有文章把这些串了吗??我没找到,谢谢哈。

    举个例子最好,我以为一句话就能全说清楚了呢。。。:)
  • y
    yrpen
    开多少线程要看你的程序性能的上限以及性能和线程的相关性 顶一顶
  • z
    znm
    着一般是个程序启动可配置的参数,然后性能测试测出来的 iOS fly ~
  • l
    linlance2000
    这块我知道啦,我也是被bug给实际测出来的,程序已经交付了。

    但是事后想总结下,我说的几个问题之间的比例关系,麻烦给讲讲?先谢谢。

    硬件CPU,核心数,操作系统里的线程数,软件里的线程池,线程数,数据库连接数,连接池的连接数。。
  • j
    jeremygoo
    你把CPU的多核线程和代码的线程搞混了
  • 挺能说的
    回复10#pas_dts

    兄弟,你会你给大家讲讲呗
  • H
    Hisoka-J
    你不是量化交易的开发吗?怎么去做运维了。 从不稀释德味~
  • l
    linlance2000
    所以需要大师们给醍醐灌顶一下。。。来给我神功灌顶吧~~~谢谢。。



    没人,也得干~~~
    还干维修工。。。

    不过我下个月离职了,太累了。。哎。。。
  • 挺能说的
    回复26#linlance2000

    兄弟,别搞技术了,搞项目管理吧。
  • k
    keetian
    这个一时半会讲不清楚,还是系统的从头来一遍
  • l
    linlance2000
    本来在做项目管理,但是量化投资技术这块,是大学时候的一个梦想啊。。。
    哈哈,所以很有兴趣去弄。。。感觉也好玩。。。
    躺着挣钱不爽吗?:P 哈哈,我开玩笑,但是这块,我程序都交付了,

    但是自己一知半解很不爽。。。

    来求问问的。。


    详细的话,确实内容很多,但是只是把这个些参数串一遍,应该有人可以吧?

    那些详细内容我其实都看过了,我程序都交付了。。。但是对这些数据之间的比例、关系,不太清楚。
  • @
    @@@@@@
    CPU 的超线程和程序的多线程是不同概念,具体哪个线程在哪个核心上执行你不用管,操作系统会调度。你只要考虑好共享资源在线程上的分配就行,比如一个全局变量多个线程去读没问题,如果多个线程同时写,可能就不行了,或者是一个文件或者是一块内存,把这个管理好,开多少线程就只和硬件性能有关了。
    当然还有些高级的玩法就是指定哪个线程独占CPU的哪个核心,这时候就要考虑硬件核心数的问题了,但是通常ring3的程序不会用到。
  • l
    linlance2000
    嗯,我知道不用管,但是想知道下全套拳法啦。。。
    比如cpu一般双核,8个核心?多线程不考虑线程锁死资源等等情况,这些写程序的时候会顾忌到。但是现在只是考虑这些数值之间的比例关系,能否举例说明哈。
  • 碧的绿
    max worker搞大就不报错,肯定没解决根本问题,等着吧
  • a
    ahphone
    这个基础不是一般地差啊,运维很多工作都自动化了,脚本编写能力,后台管理平台的编码能力,我见过很多很牛逼的。楼主这个水平很危险啊
  • B
    BoaHancock
    设置线程数 需要慢慢调整 然后看cpu 使用率和 load 一般首次可以设置 cpu 核心 的2倍 然后看看cpu 和load 和程序的性能 比如一条业务线的执行时间 具体情况要具体看 指标总体上是这几个
  • l
    linlance2000
    没事,我马上退休了,水平差见笑了,等高水平小伙伴来讲明白了就好了。

    这种评价类上面说了很多了,很差~~不是一般的差,是二班的差~~

    还是希望见到点干货哈。。。



    感谢指点,CPU 的核心数是不是就是我截图上那个,比如看到8个?有没有一般比例?比如8个核心,一般设置16个超线程什么的。
  • f
    flyingforce
    首先你得把cpu的线程和程序的线程分开,单核cpu一样可以运行多线程程序,cpu工作始终是分片的,他在运行你的程序的时候一样还在运行其他工作,比如操作系统的各种活,你后端的一个daemon程序

    然后作为你的程序,基于业务的不同,两个线程的复杂度肯定是不一样的,所以每个线程执行时间也肯定不一样,操作系统会把你程序要求执行的线程分配到某个cpu核心的时间分片去执行。一般情况下你不用考虑你的线程和cpu线程的关系。

    再说程序线程和数据库连接的关系,一个线程操作数据库肯定是分两部分的,一部分是操作数据库,另外一部分是准备数据或者操作返回的数据结果;而数据库在程序自己操作数据的时候是可以干别的事情了,线程可以把数据库连接释放让别的线程来操作数据库。所以理论上你程序的线程数和数据库线程数的比例是你的程序操作数据库时间与操作数据的比例。但是在现实中,这个比例是在动态变化的,你能做的只能是调优,给到一个差不多的比例;而且客观上随着数据规模的变化,这个比例还会变化。 iOS fly ~
  • l
    linlance2000
    太感谢了,干货满满,我明白不用关心CPU的线程数了,但是仍旧想知道之间有什么比例关系会更好一些?对这方面的概念,我基础概念都不太清楚,后半段没问题。




    嗯嗯,讲的很清楚,谢谢哈~~谢谢两位。。给我解惑。。。

    那针对intel的CPU来说,他的核心数,是不是就是刚才我调出图片的地方,看到的?是8个核心?所以是8个硬件核心,但是Intel可以作为16核心来看?或者实际上是4核心,只是intel看起来是8核心?感觉这样理解对了。

    然后操作系统的线程数1600多那个,是操作系统的线程数,所以我建立的线程跟CPU的没太管大关系,在其他情况都一样的情况下,是核心数越高,性能越强,节省的时间越多,对吧?:)

    而AMD没这个专利,所以4核心就只有4个核心。

    谢谢两位。。。
  • 氓风
    cpu使用记录下面的8个块是线程
  • s
    swyu123
    感觉就是4个人。。。每个人用一只手 和 两只手 吃饭的概念。。。两只手 饭吃的快一点,,,如果已经吃撑了,,,那么一只手 两只手 吃饭效果是一样的。。。


    估计是这样吧。。。
  • s
    swyu123
    低负载 多线程有意义,高负载 多线程就没啥多大意义了。。。估计是这样。。。
  • L
    LittlePan
    对于程序的多线程来说,你开多少都行,具体如何利用CPU,是操作系统的事儿,就是单核跑多线程也给你安排的妥妥的。 还有,你说的线程开多了会有读写冲突? 如果线程同步做好了,读写不会冲突,换句话说,线程的读写冲突和线程数量没有本质关系。 更详细的知识可以看 《Windows核心编程》,讲的非常透。
  • 木鱼虫
    回复19#linlance2000


    https://mp.weixin.qq.com/s/U_KqHwpFBSz5H8gyLwcQpQ

    这篇文章对你有点帮助
  • 猪头大哥
    你妹的

    1.控制最高并发线程数 如:20 或40 不同的cpu 可以同时并发的最高值是不一样的

    2. 每一个进程可以共享一个DB 链接

    3. 引入等待 线程池 先进先出


    这东西需要线程架构的 你要完全理清整个结构

    才能找到最合适的数值
  • j
    jckimi
    从头教你没意义,你又不是专业的底子。关键词,cpu时间线分片
  • @
    @@@@@@
    你给非专业的说这个词,他更懵。
  • j
    jckimi
    回复46#@@@@@@
    他要自己去学啊,给个关键词自己去学习好了 Kimi
  • n
    net.ieee
    搞多线程的得了解互斥,加锁和信号量这种概念
  • s
    speedmax.cn
    2k哥你搞太复杂了,感觉你搞个nodejs单线程加异步回调外面套个pm2直接fork cpu core 个node process就能充分利用机器性能了,当然如果你的计算都是大量费cpu就不能这么搞。本质上,按照现在流行的服务端编程理念,压根就不需要那么多线程,关键还是要看你的业务逻辑到底是io向还是cpu密集向,如果是io向,直接用我说的单线程加异步回调就可以了。cpu密集向那你就用专门的threadpool去跑这些job,跟io threadpool隔离开。至于db connection pool那个是个池子装db连接的,你只要保证你的sql不要太慢,否则来不及回收,池子里面没链接了,程序就跪了,内外保持平衡就可以。