日常小记-线程&进程

概括性

  • 线程 == 多个执行实例
  • 多线程是一种编程模型,多线程并不一定需要多CPU多Core, 单CPU单Core系统依然可以运行多线程程序(虽然最大化利用多CPU多Core的处理能力是多线程程序设计的一个重要目标)
  • 【时间分片技术】 -- cpu 亲和性 & 绑核

1个人无法同时做多件事,单CPU/单Core也不可以,操作系统通过 时间分片技术  应对远多于CPU/Core数的多任务执行的挑战。也可以把有些任务只分配给某些人去完成,这对应到 CPU亲和性和绑核

相关查看命令

lscpu

lscpu -- 这个很不错! 
	- CPU(s): 系统中的逻辑CPU总数
	- Thread(s) per core: 每个物理核心支持的逻辑线程数,
        例如支持超线程技术的CPU通常为2 【什么是超线程哇???】

mpstat 

显示各个CPU的统计信息

mpstat -- 显示各个CPU的统计信息

mpstat
Linux 5.4.0-113-generic (hostname)    08/17/2021    _x86_64_    (4 CPU)

12:00:00 AM  CPU  %usr  %nice  %sys  %iowait  %irq  %soft  %steal  %guest  %gnice  %idle
12:10:01 AM  all   1.50  0.00  0.50  0.10     0.00  0.20   0.00    0.00    0.00    97.70
12:10:01 AM    0   1.00  0.00  0.40  0.20     0.00  0.10   0.00    0.00    0.00    98.30
12:10:01 AM    1   1.70  0.00  0.30  0.10     0.00  0.20   0.00    0.00    0.00    97.70
12:10:01 AM    2   1.80  0.00  0.60  0.10     0.00  0.10   0.00    0.00    0.00    97.40
12:10:01 AM    3   1.40  0.00  0.70  0.00     0.00  0.40   0.00    0.00    0.00    97.50
  • CPU:   代表CPU的编号。当显示all时,表示对所有CPU的汇总统计。
  • %usr:   用户态CPU时间的百分比。指在用户空间执行的任务消耗的处理器时间

高%usr值可能表示CPU密集型应用正在运行,比如计算密集的处理或数据压缩

  • %nice:   经过调整优先级的用户态CPU时间的百分比。指运行经过nice命令调整优先级的进程所消耗的处理器时间。 【不是很懂?】
  • %sys:   内核态CPU时间的百分比。指内核空间执行的任务消耗的处理器时间。

高%sys值可能表示有大量的系统调用或内核操作,比如大量的I/O操作】

  • %iowait:   I/O等待时间的百分比。表示CPU等待I/O操作完成而消耗的时间

【高%iowait值通常表示硬盘或网络I/O瓶颈】

  • %irq:   硬中断(硬件中断)处理时间的百分比。指硬件中断处理程序消耗的处理器时间
  • %soft:   软中断(软件中断)处理时间的百分比。指软中断处理程序(通常是设备驱动程序)的处理消耗的处理器时间
  • %steal:   虚拟化中"偷窃"时间的百分比。表示虚拟机管理程序在虚拟机上运行其他进程时消耗的时间。高%steal值通常出现在虚拟化环境中,表示虚拟机资源争用。
  • %guest:   客户机CPU时间的百分比。指在Hypervisor上运行的客户机操作系统消耗的时间
  • %gnice:   经调整优先级的客户机CPU时间的百分比。与%guest类似,但指经过nice调整优先级的客户机任务。
  • %idle:   空闲时间的百分比。当CPU没有任务执行且未处于等待状态时消耗的时间。高%idle值表示CPU大部分时间处于空闲状态
使用建议
  • %usr值:检查是否有CPU密集型应用正在运行,可能需要优化代码或分配更多CPU资源。
  • %sys值:可能存在大量系统调用或内核操作,检查是否有不必要的系统调用或I/O操作。
  • %iowait值:表示存在I/O瓶颈,考虑优化存储设备或分配更多带宽。
  • %steal值:常见于虚拟化环境,表示虚拟机管理程序抢占了CPU时间。考虑优化虚拟机配置。

vmstat

用于报告系统的虚拟内存、进程、CPU活动、磁盘I/O、分页和系统调用的统计信息。它可以帮助你快速了解系统的性能瓶颈和资源使用情况。 

vmstat 1 5 将每秒报告一次系统统计信息,共5次。

vmstat 1 5

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  83560  12374 3044920    0    0     1     1    4    6  1  0 99  0  0
 0  0      0  83560  12374 3044920    0    0     0     0  113  204  0  0 100 0  0
 0  0      0  83560  12374 3044920    0    0     0     0   79  150  0  0 100 0  0
  1. procs 板块

    • r: 运行队列中的进程数。表示有多少个进程正在等待CPU时间。如果这个值长期高于CPU核心数,可能表示CPU瓶颈。
    • b: 等待资源(如I/O操作)的进程数。表示有多少进程正处于不可中断的睡眠状态(通常等待磁盘I/O)。
  2. memory 板块

    • swpd: 已使用的交换空间(swap space)量,单位为KB。
    • free: 空闲内存量,单位为KB。
    • buff: 用作缓冲区的内存量,单位为KB。
    • cache: 用作文件系统缓存的内存量,单位为KB。
  3. swap 板块

    • si: 从交换空间读入内存的量(swap-in),单位为KB/s。
    • so: 从内存写入交换空间的量(swap-out),单位为KB/s。
  4. io 板块

    • bi: 块设备读操作量,单位为块/秒。
    • bo: 块设备写操作量,单位为块/秒。
  5. system 板块

    • in: 每秒钟的中断数,包括时钟中断。
    • cs: 每秒钟的上下文切换次数。高上下文切换数可能表示线程过多或锁争用严重。
  6. cpu 板块

    • us: 用户空间运行时间,比率值。表示非内核进程消耗的CPU时间百分比。
    • sy: 内核空间运行时间,比率值。表示内核进程和系统调用消耗的CPU时间百分比。
    • id: 空闲时间,比率值。表示CPU闲置的时间百分比。
    • wa: 等待I/O操作完成的时间,比率值。表示CPU等待I/O操作的时间百分比。
    • st: 被虚拟机抢占的时间,比率值。表示虚拟化环境中,由其他虚拟机抢占的时间百分比。
快速分析
  • 高 r 值:如果 r 值长期高于CPU核心数,系统可能存在CPU瓶颈。
  • 高 b 值:如果 b 值较高,表明有多个进程在等待I/O操作。
  • swap 板块 - 高 si 和 so 值表示系统正在频繁使用交换空间,可能需要增加物理内存。
  • io 板块 - 高 bi 和 bo 值表示系统正在进行大量的磁盘读写操作。
  • 高 us 值:表示用户进程正在大量使用CPU,可能需要优化这些进程。
  • 高 sy 值:表示系统进程或系统调用频繁,可能需要检查和优化内核参数。
  • 高 wa 值:表示系统在等待磁盘I/O操作,需要检查I/O性能问题。
  • 高 st 值:表示虚拟化环境下,本虚拟机被其他虚拟机抢占了CPU资源。

温故知新

线程池子相关配置 (核心线程数是指线程池在空闲情况下最小保留的线程数量(即使这些线程是空闲的)
✅ 配置原则:应根据系统的CPU核心数和应用程序的并发需求来设置。
✅  I/O密集型任务:核心线程数 可以设置为 CPU 核心数的2倍或更多
✅  CPU密集型任务:核心线程数 应设置为 CPU 核心数 + 1 或 CPU 核心数 

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.javaJava类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值