当前位置: 首页 > news >正文

网上宿迁官方网站如何制作一个企业网站

网上宿迁官方网站,如何制作一个企业网站,wordpress文章合并,东莞关键词优化排名在《一文读懂 | 进程怎么绑定 CPU》这篇文章中介绍过#xff0c;在 Linux 内核中会为每个 CPU 创建一个可运行进程队列#xff0c;由于每个 CPU 都拥有一个可运行进程队列#xff0c;那么就有可能会出现每个可运行进程队列之间的进程数不一样的问题#xff0c;这就是所谓的… 在《一文读懂 | 进程怎么绑定 CPU》这篇文章中介绍过在 Linux 内核中会为每个 CPU 创建一个可运行进程队列由于每个 CPU 都拥有一个可运行进程队列那么就有可能会出现每个可运行进程队列之间的进程数不一样的问题这就是所谓的 负载不均衡 问题如下图所示图1最极端的情况是一个 CPU 的可运行进程队列拥有非常多的进程而其他 CPU 的可运行进程队列为空这就是著名的 一核有难多核围观如下图图2为了避免这个问题的出现Linux 内核实现了 CPU 可运行进程队列之间的负载均衡。接下来我们将会介绍 CPU 间的负载均衡的实现原理。本文使用的内核版本为Linux-2.6.23CPU 间负载均衡原理CPU 间负载不均衡的根本原因就是CPU 的可运行进程队列中的进程数量不均衡导致的。所以要解决 CPU 间负载不均衡的方法就是将最繁忙的 CPU 可运行进程队列的一些进程迁移到其他比较空闲的 CPU 中从而达到 CPU 间负载均衡的目的。当然在 2.6.0 版本的内核的确是这样实现的我们可以看看其实现代码static void  load_balance(runqueue_t *this_rq, int idle, cpumask_t cpumask) {int imbalance, idx, this_cpu  smp_processor_id();runqueue_t *busiest;prio_array_t *array;struct list_head *head, *curr;task_t *tmp;// 1. 找到最繁忙的 CPU 运行队列busiest  find_busiest_queue(this_rq, this_cpu, idle, imbalance, cpumask);if (!busiest)goto out;...head  array-queue  idx;curr  head-prev;skip_queue:// 2. 从最繁忙运行队列中取得一个进程tmp  list_entry(curr, task_t, run_list);...// 3. 把进程从最繁忙的可运行队列中迁移到当前可运行队列中pull_task(busiest, array, tmp, this_rq, this_cpu);... } load_balance 函数主要用于解决 CPU 间负载均衡问题其主要完成以下 3 个步骤从所有 CPU 的可运行队列中找到最繁忙的可运行队列。从最繁忙可运行队列中取得一个进程。把进程从最繁忙的可运行队列中迁移到当前可运行队列中。这是 2.6.0 版本的解决方案但这个方案并不是最优的因为现代 CPU 架构是非常复杂的比如一个物理 CPU 有多个核心多核而每个核心又可以通过超线程Hyper-Threading来实现多个逻辑 CPU如下图所示图3如上图所示一个物理 CPU 中拥有 4 个核心而每个核心又拥有 2 个超线程。在 Linux 内核中会为每个超线程定义一个可运行进程队列所以 Linux 内核会为上面的 CPU 定义 8 个可运行进程队列。现在问题来了在上面的 CPU 架构中不同的可运行队列之间的进程迁移代价是不一样的。因为同一个核心的不同超线程共用了所有的缓存所以同一个核心不同超线程间的进程迁移代价是最小的。而同一个物理 CPU 不同核心间也会共用某些缓存所以不同核心间的进程迁移的代价会比同一核心不同超线程间的进程迁移稍大。由于现在很多主板都支持安装多个物理 CPU而不同物理 CPU 间基本不会共用缓存所以不同物理 CPU 间的进程迁移代价最大。如下图所示图中的 L1、L2 和 L3 分别指一级、二级和三级缓存图4为了解决进程迁移成本的问题新版本的 Linux 内核引入了 调度域 和 调度组。调度域与调度组从前面的分析可知根据 CPU 的物理架构可以划分为不同的物理 CPU、相同 CPU 不同的核心、相同核心不同的超线程等如下图所示图5在 Linux 内核中把这个层级成为 调度域。从前面的分析可知越下层的调度域共用的缓存就越多所以在进程迁移时优先从底层的调度域开始进行。由于内核为每个超线程定义一个可运行队列所以图 3 中的 CPU 拥有 8 个可运行队列。而根据不同的调度域可以把这 8 个可运行队列划分为不同的 调度组如下图所示图6如上图所示由于每个超线程都拥有一个可运行队列所以图 3 的 CPU 拥有 8 个可运行队列而这些可运行队列可以根据不同的核心来划分为 4 个调度组而这 4 个调度组可以根据不同的物理 CPU 来划分成 1 个调度组。由于越底层的调度域共用的缓存越多所以对 CPU 可运行队列进行负载均衡时优先从底层调度域开始。比如把 Thread0 可运行队列的进程迁移到 Thread1 可运行队列的代价要比迁移到 Thread2 可运行队列的小这是由于 Thread0 与 Thread1 属于同一个核心同一个核心共用所有的 CPU 缓存。在 Linux 内核中调度域使用 sched_domain 结构表示而调度组使用 sched_group 结构表示。我们来看看 sched_domain 结构的定义struct sched_domain {struct sched_domain *parent;    /* top domain must be null terminated */struct sched_domain *child;     /* bottom domain must be null terminated */struct sched_group  *groups;    /* the balancing groups of the domain */cpumask_t            span;      /* span of all CPUs in this domain */... }; 下面介绍一下 sched_domain 结构各个字段的作用parent由于调度域是分层的上层调度域是下层的调度域的父亲所以这个字段指向的是当前调度域的上层调度域。child如上所述这个字段用来指向当前调度域的下层调度域。groups每个调度域都拥有一批调度组所以这个字段指向的是属于当前调度域的调度组列表。span这个字段主要用来标记属于当前调度域的 CPU 列表每个位表示一个 CPU。我们接着分析一下 sched_group 结构其定义如下struct sched_group {struct sched_group *next;cpumask_t           cpumask;... }; 下面介绍一下 sched_group 结构各个字段的作用next指向属于同一个调度域的下一个调度组。cpumask用于标记属于当前调度组的 CPU 列表每个位表示一个 CPU。它们之间的关系如下图所示图7CPU 间负载均衡实现要实现 CPU 间的负载均衡只需要将最繁忙的可运行队列中的一部分进程迁移到空闲的可运行队列中即可。但由于 CPU 缓存的原因对使用不同的 CPU 缓存的可运行队列之间进行进程迁移将会导致缓存丢失从而导致性能损耗。所以Linux 内核会优先对使用相同 CPU 缓存的可运行队列之间进行进程迁移。1. CPU 间负载均衡触发时机当 CPU 的负载不均衡时内核就需要对 CPU 进行负载均衡。负载均衡的触发时机比较多如进程被创建、进程被唤醒、进程休眠和时钟中断等这里我们介绍一下在时钟中断时怎么进行 CPU 间的负载均衡。在 Linux 内核中是通过 rq 结构来描述一个可运行进程队列的它有个名为 sd 的字段用于指向其所属的 调度域 层级的最底层如下所示struct rq {...struct sched_domain *sd;... } 它与调度域和调度组的关系如下图所示图8在时钟中断下半部处理中会通过调用 run_rebalance_domains 函数来对 CPU 进行负载均衡处理而 run_rebalance_domains 接着会通过调用 rebalance_domains 函数来完成负载均衡的工作其实现如下static inline void  rebalance_domains(int cpu, enum cpu_idle_type idle) {int balance  1;struct rq *rq  cpu_rq(cpu);unsigned long interval;struct sched_domain *sd;unsigned long next_balance  jiffies  60*HZ;int update_next_balance  0;// 遍历可运行队列的调度组层级 (从最底层开始)for_each_domain(cpu, sd) {...// 由于对 CPU 进行负载均衡可能会导致 CPU 缓存丢失// 所以对 CPU 进行负载均衡不能太频繁, 必须隔一段时间才能进行// 这里就是判断上次进行负载均衡与这次的间隔是否已经达到合适的时间// 如果时间间隔已经达到一段时间, 那么就调用 load_balance 函数进行负载均衡if (time_after_eq(jiffies, sd-last_balance  interval)) {if (load_balance(cpu, rq, sd, idle, balance)) {idle  CPU_NOT_IDLE;}sd-last_balance  jiffies;}...}... } 由于每个 CPU超线程都有一个可运行队列而 rebalance_domains 函数的工作就是获取当前 CPU 超线程的可运行队列然后从最底层开始遍历其调度域层级由于越底层的调度域进行进程迁移的代价越小。由于对 CPU 进行负载均衡可能会导致 CPU 缓存丢失所以对 CPU 进行负载均衡不能太频繁需要隔一段时间才能进行。那么在对 CPU 进行负载均衡前就需要判断上次进行负载均衡与这次的时间间隔是否合理。如果时间间隔合理, 那么就调用 load_balance 函数对调度域进行负载均衡。load_balance 函数实现如下static int load_balance(int this_cpu, struct rq *this_rq, struct sched_domain *sd,enum cpu_idle_type idle, int *balance) {...redo:// 1. 从调度域中找到一个最繁忙的调度组group  find_busiest_group(sd, this_cpu, imbalance, idle, sd_idle,cpus, balance);...// 2. 从最繁忙的调度组中找到一个最繁忙的运行队列busiest  find_busiest_queue(group, idle, imbalance, cpus);...if (busiest-nr_running  1) {...// 3. 从最繁忙的运行队列中迁移一些任务到当前任务队列ld_moved  move_tasks(this_rq, this_cpu, busiest, imbalance, sd, idle,all_pinned);...}...return 0; } load_balance 函数主要完成 3 个工作从 调度域 中找到一个最繁忙的 调度组。从最繁忙的 调度组 中找到一个最繁忙的 可运行队列。从最繁忙的 可运行队列 中迁移一些任务到当前 可运行队列。这样就完成了 CPU 间的负载均衡处理。推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~嵌入式Linux微信扫描二维码关注我的公众号
http://www.pierceye.com/news/210828/

相关文章:

  • 网站单页seo个人服务器网站备案
  • 装修队伍做网站做机票在线预订网站
  • 手机版企业网站php山西建设执业注册中心网站
  • 南充网站建设略奥科技凡科建站电话
  • 个人网站可以做自媒体吗手机网站建设需要多少钱
  • 网站 模板网站什么英文字体
  • 北京市朝阳区住房建设网站图片在线编辑网站
  • 柳州市诚信体系建设网站网站数据库网络错误
  • 微站网站vps lnmp wordpress
  • 哪里有网站建设哪家好word做网站框架
  • 企业建网站的费用百度掘金入口官网
  • 德洲网站建设wordpress的title设置
  • 苏州企业网站制作服务河北关键词排名推广
  • 营销型集团网站建设镇江网站推广
  • 怎样才能制做免费网站golang 网站开发 开源
  • 哈尔滨做网站哪好免费网站模板
  • 网站怎么做才有效果如何用博客网站做cpa
  • 网站申请书博客系统做网站
  • 灰色行业老域名做网站不收录初学者的网站建设
  • 网站做成微信小程序贵州企业seo
  • 在淘宝做印刷网站怎么办wordpress 主题 edu
  • 成都设计公司网站线上线下一体化营销
  • 网站你懂我意思正能量晚上下载注册公司需要多少钱手续费
  • 在线html网站开发广州网站排名优化公司
  • 如何在免费网站上做推扩自己怎么来建设网站
  • 福安市教育局建设网站做架构图简单的网站
  • 如何快速进行网站开发seo是什么东西
  • 网站建设需要具备哪些学编程多少钱学费
  • 建设工程许可证在那个网站办金融行业网站制作
  • 邢台专业做网站价格信息流广告是什么