习吾学

徐武的技术博客

今天学习了什么?第n+3天

84 0

今天没多少个人学习时间,就把工作中碰到的东西略微总结下。

用到的几个excel函数

VLOOKUP、IFERROR

VLOOKUP([lookup_value],[table_array],[col_index_num],[range_lookup])
# 网上有人有很形象的总结:
VLOOKUP(找什么,去哪找,找哪个,怎么找)

举个例子,有两列数据如下:

需求:在A列中找B列内容。我们分解下:

  • 找什么(lookup_value):B列内容
  • 去哪找(table_array):A列
  • 找哪个(col_index_num):这里表示“去哪找”中第几列内容,本次查找只找A列,只有一列,所以添1即可
  • 怎么找(rang_lookup):这里填0表示精确查找,填1表示模糊查找

所以,这个公式就可以写成:‌=VLOOKUP(B1,A:A,1,0),表示在A列中找B1内容,找第一列,并且精确匹配,可以看出B1值h在A列中没找到,所以返回#N/A

让公式作用于余下内容

如果你不想看到#N/A,可以利用IFERROR函数将报错改为其他内容,比如“A列中无”

那么公式就改写为:=IFERROR(VLOOKUP(B1,A:A,1,0),"A列中无")

数据去重并统计个数

用到函数:‌SUMPRODUCTCOUNTIF

# SUMPRODUCT: 返回相应的数组或区域乘积的和
SUMPRODUCT([array1],[array2],[array3]...)

# COUNTIF: 
COUNTIF(range,criteria)
- range 要计算其中非空单元格数目的区域
- criteria 以数字、表达式或文本形式定义的条件

上面那个表格中,A列明显有很多重复元素,如何组合上面两个函数去除重复元素并计算非重复元素个数呢?

  • ‌去除重复元素: 选择筛选 --> 高级筛选 --> 去除重复元素

  • ‌非重复元素计数: =SUMPRODUCT(1/COUNTIF(A1:A10,A1:A10))

下面我们来稍微解释下,选中COUNTIF(A1:A10,A1:A10),按F9,选中区域会变为{3;1;1;2;3;2;1;1;3;1},这代表A列中每个元素出现的次数

再来选中1/{3;1;1;2;3;2;1;1;3;1},按F9,选中区域会变为{0.333333333333333;1;1;0.5;0.333333333333333;0.5;1;1;0.333333333333333;1},代表每个数字被1除后的结果

最后,SUMPRODUCT({0.333333333333333;1;1;0.5;0.333333333333333;0.5;1;1;0.333333333333333;1})就是求和了。举个例子,表格中,d出现两次,经过COUNTIF运算,每个d都记录为2,被1除后,就有两个0.5,相加即为1,最终就只有一个d。

使用cgroup限制进程使用CPU相关配置

cpu配置文件说明

mount {
       cpuset  = /cgroup/cpuset;        为cgroup中的任务分配独立的cpu
       cpu     = /cgroup/cpu;           使用调度程序对cpu的使用控制
       cpuacct = /cgroup/cpuacct;       自动生成cgroup中的cpu使用的报告
       memory  = /cgroup/memory;        管理任务的内存
       devices = /cgroup/devices;       允许或拒绝cgroup中的任务访问设备
       freezer = /cgroup/freezer;       挂起或者恢复任务
       net_cls = /cgroup/net_cls;       控制网络流量
       blkio   = /cgroup/blkio;     为块设备输入输出设置,比如物理设备(磁盘,usb等)
}

cgroup中对cpu资源限制分为三种:

  • 通过cpu子系统中的cpu quote
  • 通过cpu子系统中的cpu share (在控制群组中设置权重,通过权重和任务等来分配能够使用cpu的资源)
  • 通过cpuset子系统中的cpuset将任务绑定到相应的核上(这样可以减少进程的上下文切换,提高CPU的有效利用率)

cpu 子系统可以调度 cgroup 对 CPU 的获取量。可用以下两个调度程序来管理对 CPU 资源的获取

  • 完全公平调度程序(CFS)-- 一个比例分配调度程序,可根据任务优先级 ∕ 权重或 cgroup 分得的份额,在任务群组(cgroups)间按比例分配 CPU 时间(CPU 带宽)
  • 实时调度程序(RT)-- 一个任务调度程序,可对实时任务使用 CPU 的时间进行限定

配置cgroup对某进程进行限制,启动cgroup服务后,/cgroup/cpu目录下看到如下文件

total 0
--w--w--w- 1 root   root   0 May 30 01:44 cgroup.event_control
-rw-r--r-- 1 root   root   0 May 30 01:44 cgroup.procs
-rw-r--r-- 1 root   root   0 May 30 01:44 cpu.cfs_period_us
-rw-r--r-- 1 root   root   0 May 30 01:44 cpu.cfs_quota_us
-rw-r--r-- 1 root   root   0 May 30 01:44 cpu.rt_period_us
-rw-r--r-- 1 root   root   0 May 30 01:44 cpu.rt_runtime_us
-rw-r--r-- 1 root   root   0 May 30 01:44 cpu.shares
-r--r--r-- 1 root   root   0 May 30 01:44 cpu.stat
-rw-r--r-- 1 root   root   0 May 30 01:44 notify_on_release
-rw-r--r-- 1 root   root   0 May 30 01:44 release_agent
-rw-r--r-- 1 root   root   0 May 30 01:44 tasks

其中:

  • cpu.cfs_period_us: 此参数可以设定重新分配 cgroup 可用 CPU 资源的时间间隔,单位为微秒(µs,这里以 “us” 表示)。最大值是1s,最小值是1毫秒(ms),取值范围为1000-1000000
  • cpu.cfs_quota_us 此参数可以设定在某一阶段(由 cpu.cfs_period_us 规定)某个 cgroup 中所有任务可运行的时间总量,单位为微秒(µs,这里以 "us" 代表)。一旦 cgroup 中任务用完按配额分得的时间,它们就会被在此阶段的时间提醒限制流量,并在进入下阶段前禁止运行。对于单核来说,最大等于 cpu.cfs_period_us的值,对于多核来说,可以理解为最多可使用的cpu核数。在多核的系统中, cpu.cfs_quota_us/cpu.cfs_period_us 的值就是可以使用的最大的cpu的核数
  • cpu.stat: 此参数通过以下值报告 CPU 时间统计:
    • nr_periods 时间间隔, 指经过了多少个cpu.cfs_period_us的时间间隔
    • nr_throttled 被限制运行的次数
    • throttled_time 总共被限制的时间,微秒
  • tasks 将需要控制的任务的id写入到tasks文件中,就可以控制资源了
  • cpu.shares:此参数用一个整数来设定 cgroup 中任务 CPU 可用时间的相对比例。例如: cpu.shares 设定为 100 的任务,即便在两个 cgroup 中,也将获得相同的 CPU 时间;但是 cpu.shares 设定为 200 的任务与 cpu.shares 设定为 100 的任务相比,前者可使用的 CPU 时间是后者的两倍,即便它们在同一个 cgroup 中。cpu.shares 文件设定的值必须大于等于 2。

请注意:在多核系统中,CPU 时间比例是在所有 CPU 核中分配的。即使在一个多核系统中,某个 cgroup 受限制而不能 100% 使用 CPU,它仍可以 100% 使用每个单独的 CPU 核。

  • cpu.rt_period_us: 此参数可以设定在某个时间段中 ,每隔多久,cgroup 对 CPU 资源的存取就要重新分配,单位为微秒(µs,这里以“us”表示),只可用于实时调度任务。如果某个 cgroup 中的任务,每秒内有 0.2 秒可存取 CPU 资源,则请将 cpu.rt_runtime_us 设定为 200000,并将 cpu.rt_period_us 设定为 1000000。
  • cpu.rt_runtime_us: 此参数可以指定在某个时间段中, cgroup 中的任务对 CPU 资源的最长连续访问时间,单位为微秒(µs,这里以“us”表示),只可用于实时调度任务。建立这个限制是为了防止一个 cgroup 中的任务独占 CPU 时间。如果 cgroup 中的任务,在每秒内有 0.2 秒可存取 CPU 资源,请将 cpu.rt_runtime_us 设定为 200000,并将 cpu.rt_period_us 设定为 1000000。请注意:运行时间和阶段参数会根据 CPU 操作。例如:如要允许一个实时任务完全利用两个 CPU,请将 cpu.cfs_quota_us 设定为 200000 并将 cpu.cfs_period_us 设定为 100000。

参考文章:

https://www.jianshu.com/p/ca562f9c328e

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html-single/resource_management_guide/index#chap-Introduction_to_Control_Groups

利用Jupyter Notebook打造go及python交互式编程环境
Comments
Write a Comment