NodeJs多线程、多进程、定时任务

NodeJs多线程、多进程、定时任务,第1张

JS是单线程语言,减少了线程间切换的开销,且不用考虑锁的问题,因此适合IO密集型项目。

JS的单线程,其实指的是js主引擎线程的。除此之外还有定时器线程、异步>

node-wfh9是华为MateBookD14。华为MateBookD14在家族兄弟姐妹中扮演着实用者的角色,外观非常的沉稳和大气,整个机身外壳采用的是阳极氧化40道工序重重淬炼的铝合金材质,表面也做了细腻的金属喷砂工艺,手感光滑。铝合金材质在确保机身强度和韧性的同时,也尽量做了轻量化处理,深空灰的配色强调质感。

node-wfh9的配置

node-wfh9的CPU是英特尔酷睿i71165G7,默频28GHz,单核最大睿频47GHz,GPU是NVIDIAMX450,默频1395MHz,内存是16GB,硬盘是512GBNVMePCIeSSD,电池是56Wh,其他是WiFi6、2x2MIMO天线、蓝牙51,i71165G7这颗CPU,默频28GHz,单核最大睿频47GHz,全核最大睿频41GHz。

我们先从整体上看一下Kubernetes的一些理念和基本架构, 然后从网络、 资源管理、存储、服务发现、负载均衡、高可用、rolling upgrade、安全、监控等方面向大家简单介绍Kubernetes的这些主要特性。

当然也会包括一些需要注意的问题。主要目的是帮助大家快速理解 Kubernetes的主要功能,今后在研究和使用这个具的时候有所参考和帮助。

1Kubernetes的一些理念:

用户不需要关心需要多少台机器,只需要关心软件(服务)运行所需的环境。以服务为中心,你需要关心的是api,如何把大服务拆分成小服务,如何使用api去整合它们。

保证系统总是按照用户指定的状态去运行。

不仅仅提给你供容器服务,同样提供一种软件系统升级的方式;在保持HA的前提下去升级系统是很多用户最想要的功能,也是最难实现的。

那些需要担心和不需要担心的事情。

更好的支持微服务理念,划分、细分服务之间的边界,比如lablel、pod等概念的引入。

对于Kubernetes的架构,可以参考官方文档。

大致由一些主要组件构成,包括Master节点上的kube-apiserver、kube-scheduler、kube-controller-manager、控制组件kubectl、状态存储etcd、Slave节点上的kubelet、kube-proxy,以及底层的网络支持(可以用Flannel、OpenVSwitch、Weave等)。

看上去也是微服务的架构设计,不过目前还不能很好支持单个服务的横向伸缩,但这个会在 Kubernetes 的未来版本中解决。

2Kubernetes的主要特性

会从网络、服务发现、负载均衡、资源管理、高可用、存储、安全、监控等方面向大家简单介绍Kubernetes的这些主要特性 -> 由于时间有限,只能简单一些了。

另外,对于服务发现、高可用和监控的一些更详细的介绍,感兴趣的朋友可以通过这篇文章了解。

1)网络

Kubernetes的网络方式主要解决以下几个问题:

a 紧耦合的容器之间通信,通过 Pod 和 localhost 访问解决。

b Pod之间通信,建立通信子网,比如隧道、路由,Flannel、Open vSwitch、Weave。

c Pod和Service,以及外部系统和Service的通信,引入Service解决。

Kubernetes的网络会给每个Pod分配一个IP地址,不需要在Pod之间建立链接,也基本不需要去处理容器和主机之间的端口映射。

注意:Pod重建后,IP会被重新分配,所以内网通信不要依赖Pod IP;通过Service环境变量或者DNS解决。

2) 服务发现及负载均衡

kube-proxy和DNS, 在v1之前,Service含有字段portalip 和publicIPs, 分别指定了服务的虚拟ip和服务的出口机ip,publicIPs可任意指定成集群中任意包含kube-proxy的节点,可多个。portalIp 通过NAT的方式跳转到container的内网地址。在v1版本中,publicIPS被约定废除,标记为deprecatedPublicIPs,仅用作向后兼容,portalIp也改为ClusterIp, 而在service port 定义列表里,增加了nodePort项,即对应node上映射的服务端口。

DNS服务以addon的方式,需要安装skydns和kube2dns。kube2dns会通过读取Kubernetes API获取服务的clusterIP和port信息,同时以watch的方式检查service的变动,及时收集变动信息,并将对于的ip信息提交给etcd存档,而skydns通过etcd内的DNS记录信息,开启53端口对外提供服务。大概的DNS的域名记录是servicenamenamespacetenxdomain, “tenxdomain”是提前设置的主域名。

注意:kube-proxy 在集群规模较大以后,可能会有访问的性能问题,可以考虑用其他方式替换,比如HAProxy,直接导流到Service 的endpints 或者 Pods上。Kubernetes官方也在修复这个问题。

3)资源管理

有3 个层次的资源限制方式,分别在Container、Pod、Namespace 层次。Container层次主要利用容器本身的支持,比如Docker 对CPU、内存、磁盘、网络等的支持;Pod方面可以限制系统内创建Pod的资源范围,比如最大或者最小的CPU、memory需求;Namespace层次就是对用户级别的资源限额了,包括CPU、内存,还可以限定Pod、rc、service的数量。

资源管理模型 -》 简单、通用、准确,并可扩展

目前的资源分配计算也相对简单,没有什么资源抢占之类的强大功能,通过每个节点上的资源总量、以及已经使用的各种资源加权和,来计算某个Pod优先非配到哪些节点,还没有加入对节点实际可用资源的评估,需要自己的scheduler plugin来支持。其实kubelet已经可以拿到节点的资源,只要进行收集计算即可,相信Kubernetes的后续版本会有支持。

4)高可用

主要是指Master节点的 HA方式 官方推荐 利用etcd实现master 选举,从多个Master中得到一个kube-apiserver 保证至少有一个master可用,实现high availability。对外以loadbalancer的方式提供入口。这种方式可以用作ha,但仍未成熟,据了解,未来会更新升级ha的功能。

一张图帮助大家理解:

也就是在etcd集群背景下,存在多个kube-apiserver,并用pod-master保证仅是主master可用。同时kube-sheduller和kube-controller-manager也存在多个,而且伴随着kube-apiserver 同一时间只能有一套运行。

5) rolling upgrade

RC 在开始的设计就是让rolling upgrade变的更容易,通过一个一个替换Pod来更新service,实现服务中断时间的最小化。基本思路是创建一个复本为1的新的rc,并逐步减少老的rc的复本、增加新的rc的复本,在老的rc数量为0时将其删除。

通过kubectl提供,可以指定更新的镜像、替换pod的时间间隔,也可以rollback 当前正在执行的upgrade *** 作。

同样, Kuberntes也支持多版本同时部署,并通过lable来进行区分,在service不变的情况下,调整支撑服务的Pod,测试、监控新Pod的工作情况。

6)存储

大家都知道容器本身一般不会对数据进行持久化处理,在Kubernetes中,容器异常退出,kubelet也只是简单的基于原有镜像重启一个新的容器。另外,如果我们在同一个Pod中运行多个容器,经常会需要在这些容器之间进行共享一些数据。Kuberenetes 的 Volume就是主要来解决上面两个基础问题的。

Docker 也有Volume的概念,但是相对简单,而且目前的支持很有限,Kubernetes对Volume则有着清晰定义和广泛的支持。其中最核心的理念:Volume只是一个目录,并可以被在同一个Pod中的所有容器访问。而这个目录会是什么样,后端用什么介质和里面的内容则由使用的特定Volume类型决定。

创建一个带Volume的Pod:

specvolumes 指定这个Pod需要的volume信息 speccontainersvolumeMounts 指定哪些container需要用到这个Volume Kubernetes对Volume的支持非常广泛,有很多贡献者为其添加不同的存储支持,也反映出Kubernetes社区的活跃程度。

emptyDir 随Pod删除,适用于临时存储、灾难恢复、共享运行时数据,支持 RAM-backed filesystemhostPath 类似于Docker的本地Volume 用于访问一些本地资源(比如本地Docker)。

gcePersistentDisk GCE disk - 只有在 Google Cloud Engine 平台上可用。

awsElasticBlockStore 类似于GCE disk 节点必须是 AWS EC2的实例 nfs - 支持网络文件系统。

rbd - Rados Block Device - Ceph

secret 用来通过Kubernetes API 向Pod 传递敏感信息,使用 tmpfs (a RAM-backed filesystem)

persistentVolumeClaim - 从抽象的PV中申请资源,而无需关心存储的提供方

glusterfs

iscsi

gitRepo

根据自己的需求选择合适的存储类型,反正支持的够多,总用一款适合的 :)

7)安全

一些主要原则:

基础设施模块应该通过API server交换数据、修改系统状态,而且只有API server可以访问后端存储(etcd)。

把用户分为不同的角色:Developers/Project Admins/Administrators。

允许Developers定义secrets 对象,并在pod启动时关联到相关容器。

以secret 为例,如果kubelet要去pull 私有镜像,那么Kubernetes支持以下方式:

通过docker login 生成 dockercfg 文件,进行全局授权。

通过在每个namespace上创建用户的secret对象,在创建Pod时指定 imagePullSecrets 属性(也可以统一设置在serviceAcouunt 上),进行授权。

认证 (Authentication)

API server 支持证书、token、和基本信息三种认证方式。

授权 (Authorization)

通过apiserver的安全端口,authorization会应用到所有>

本文适合知道NUMA这个词但想进一步了解的新手。

以下的文章内容包括:NUMA的产生背景,NUMA的架构细节和几个上机演示的例子。

在NUMA出现之前,CPU朝着高频率的方向发展遇到了天花板,转而向着多核心的方向发展。

在一开始,内存控制器还在北桥中,所有CPU对内存的访问都要通过北桥来完成。此时所有CPU访问内存都是“一致的”,如下图所示:

这样的架构称为UMA(Uniform Memory Access),直译为“统一内存访问”,这样的架构对软件层面来说非常容易,总线模型保证所有的内存访问是一致的,即 每个处理器核心共享相同的内存地址空间 。但随着CPU核心数的增加,这样的架构难免遇到问题,比如对总线的带宽带来挑战、访问同一块内存的冲突问题。为了解决这些问题,有人搞出了NUMA。

NUMA 全称 Non-Uniform Memory Access,译为“非一致性内存访问”。这种构架下,不同的内存器件和CPU核心从属不同的 Node,每个 Node 都有自己的集成内存控制器(IMC,Integrated Memory Controller)。

在 Node 内部,架构类似SMP,使用 IMC Bus 进行不同核心间的通信;不同的 Node 间通过QPI(Quick Path Interconnect)进行通信,如下图所示:

一般来说,一个内存插槽对应一个 Node。需要注意的一个特点是,QPI的延迟要高于IMC Bus,也就是说CPU访问内存有了远近(remote/local)之别,而且实验分析来看,这个 差别非常明显

在Linux中,对于NUMA有以下几个需要注意的地方:

对于初次了解NUMA的人来说,了解到这里就足够了,本文的细节探讨也止步于此,如果想进一步深挖,可以参考开源小站 这篇文章 。

NUMA Node 分配

作者使用的机器中,有两个 NUMA Node,每个节点管理16GB内存。

NUMA Node 绑定

Node 和 Node 之间进行通信的代价是不等的,同样是 Remote 节点,其代价可能不一样,这个信息在 node distances 中以一个矩阵的方式展现。

我们可以将一个进程绑定在某个 CPU 或 NUMA Node 的内存上执行,如上图所示。

NUMA 状态

100个。单核CPU上并不是只能启动一个node实例,起十个八个一点问题也没有。多个进程会分时地占用CPU,由于切换的频率很快,所以看上去他们就像是在同时运行一样。单核512M单个实例大约能支持100个数量级的并发量。

以上就是关于NodeJs多线程、多进程、定时任务全部的内容,包括:NodeJs多线程、多进程、定时任务、linux服务器cpu性能参数如何看、node-wfh9是什么型号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9873582.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存