【K8S基础】-k8s的核心概念控制器和调度器

        Kubernetes是一个开源的容器编排平台,旨在简化和自动化容器化应用程序的部署、扩展和管理。它提供了一个强大的基础设施来管理容器化应用程序的生命周期,并确保它们在整个集群中高效运行。

        Kubernetes的核心概念包括集群、节点、Pod、控制器、调度器等。本文重点讨论控制器和调度器的角色和功能。控制器负责管理应用程序的副本数目和状态,确保应用程序按预期运行。调度器负责将Pod调度到适合的节点上运行,以实现资源的最佳利用和负载均衡。我们将探讨控制器和调度器的工作原理、不同类型的控制器和调度器、它们之间的协作方式以及使用建议。

一、控制器的作用和种类

        在Kubernetes中,控制器是一种用于管理和维护应用程序状态的关键组件。 用于管理和维护应用程序的期望状态。它确保所需的Pod副本数目处于运行状态,并在需要时进行自动伸缩。常见的控制器类型包括ReplicaSet、Deployment、StatefulSet等。它们通过监控和调整Pod的数量和状态,实现应用程序的高可用性和弹性。

1.1 控制器的作用和重要性

        控制器的作用和重要性体现在以下几个方面:

  1. 应用程序可用性和弹性:控制器确保应用程序的副本数目处于运行状态,即使在节点故障或其他问题导致Pod失败的情况下,也能够自动恢复和重新创建Pod。通过监控和调整副本数目,控制器提供了高可用性和弹性,确保应用程序始终可用。

  2. 自动伸缩:控制器可以根据应用程序的负载情况自动调整副本数目。根据预定义的规则和指标,控制器可以增加或减少副本数目,以满足应用程序的需求。这种自动伸缩能力使应用程序能够根据负载变化而弹性地扩展或收缩。

  3. 版本管理和滚动更新:控制器可以管理应用程序的不同版本,并支持滚动更新。通过逐步替换旧版本的Pod,控制器可以确保应用程序在升级过程中保持可用性。这种版本管理和滚动更新的功能使得应用程序的部署和更新变得简单和可控。

  4. 配置管理:控制器可以管理应用程序的配置,包括环境变量、配置文件等。通过控制器,可以在运行时更新应用程序的配置,而无需重新部署整个应用程序。这种配置管理的能力使得应用程序的配置更加灵活和可管理。

  5. 故障检测和恢复:控制器可以监控应用程序的状态,并在发现故障或异常情况时采取相应的措施。它可以自动重启失败的Pod,或在必要时重新调度Pod到其他可用节点上运行。这种故障检测和恢复的能力提高了应用程序的可靠性和容错性。

1.2 常见的控制器类型

        在Kubernetes中,有几种常见的控制器类型,每种类型都有不同的功能和用途。以下是一些常见的控制器类型:

  1. ReplicaSet:ReplicaSet是Kubernetes最基本的控制器类型之一,用于确保指定数量的Pod副本在集群中运行。它可以根据需要自动扩展或缩减Pod的数量,以满足应用程序的需求。

  2. Deployment:Deployment是在ReplicaSet基础上构建的控制器类型,用于管理应用程序的部署和更新。它支持滚动更新,可以逐步替换旧版本的Pod,以实现应用程序的无缝升级。

  3. StatefulSet:StatefulSet用于管理有状态应用程序的部署。与ReplicaSet和Deployment不同,StatefulSet为每个Pod分配唯一的标识符和稳定的网络标识,以便于有状态应用程序的管理和数据持久化。

  4. DaemonSet:DaemonSet用于在集群中的每个节点上运行一个Pod副本。它常用于部署一些系统级别的服务,如日志收集器、监控代理等。

  5. Job和CronJob:Job用于运行一次性任务,而CronJob用于定期运行任务。它们可以确保任务的完成,并可根据需要自动重启失败的任务。

  6. Operator:Operator是一种自定义的控制器,用于管理和自动化特定类型的应用程序或服务。它结合了Kubernetes的原生资源和自定义逻辑,提供了更高级的应用程序管理功能。

1.3 常见控制器特点、用途和适用场景

        以下是一些常见控制器的特点、用途及适用场景的对比:

控制器特点用途适用场景
ReplicaSetReplicaSet用于确保指定数量的Pod副本在集群中运行。它通过监控和调整Pod的副本数目来实现高可用性和弹性。ReplicaSet适用于无状态应用程序,如Web服务器、后端API等。它可以根据负载情况自动扩展或缩减Pod的数量,以满足应用程序的需求。当需要管理和维护一组无状态应用程序的副本时,可以使用ReplicaSet。
DeploymentDeployment是在ReplicaSet基础上构建的控制器类型。它支持滚动更新,可以逐步替换旧版本的Pod,以实现应用程序的无缝升级。Deployment适用于管理应用程序的部署和更新。它提供了版本管理、滚动更新、回滚等功能,使得应用程序的部署和更新变得简单可控。当需要对应用程序进行版本管理和滚动更新时,可以使用Deployment。
StatefulSetStatefulSet用于管理有状态应用程序的部署。它为每个Pod分配唯一的标识符和稳定的网络标识,以便于有状态应用程序的管理和数据持久化。StatefulSet适用于有状态应用程序,如数据库、分布式存储等。它可以确保有状态应用程序的有序部署、扩展和数据持久化。当需要管理有状态应用程序的部署和数据持久化时,可以使用StatefulSet。
DaemonSetDaemonSet用于在集群中的每个节点上运行一个Pod副本。它常用于部署一些系统级别的服务,如日志收集器、监控代理等。DaemonSet适用于需要在每个节点上运行一个副本的服务。它可以确保在每个节点上都有相应的Pod副本,以提供系统级别的功能和服务。当需要在每个节点上运行一个Pod副本的服务时,可以使用DaemonSet。
Job和CronJobJob用于运行一次性任务,而CronJob用于定期运行任务。它们可以确保任务的完成,并可根据需要自动重启失败的任务。Job和CronJob适用于运行一次性或定期任务的场景。它们可以用于批处理作业、定期数据处理等。当需要运行一次性或定期任务时,可以使用Job和CronJob。
OperatorOperator是一种自定义的控制器,用于管理和自动化特定类型的应用程序或服务。它结合了Kubernetes的原生资源和自定义逻辑,提供了更高级的应用程序管理功能。Operator适用于复杂应用程序或服务的管理和自动化。它可以根据特定的业务逻辑和需求,实现自定义的应用程序管理功能。当需要管理和自动化特定类型应用程序或服务的功能时,可以使用Operator。

二、调度器的功能和策略

2.1 调度器的基本功能

        调度器是Kubernetes中的另一个重要概念,用于决定在哪个节点上运行Pod。调度器考虑诸如节点资源利用率、亲和性和反亲和性等因素,选择最合适的节点来运行Pod。调度器的目标是实现资源的均衡分配和高效利用,确保应用程序的性能和可靠性。 它的基本功能有以下几个面:        

  1. 节点选择:调度器从集群中的可用节点中选择最合适的节点来运行Pod。选择的依据可以包括节点的资源可用性(如CPU、内存)、节点的标签和Pod的调度要求等。

  2. 资源分配:调度器根据Pod的资源需求(如CPU和内存)以及节点的资源容量,进行资源分配。它会确保每个节点上运行的Pod的资源需求不超过节点的资源容量。

  3. 亲和性和反亲和性:调度器支持亲和性和反亲和性规则,用于指定Pod与节点之间的关系。亲和性规则可以将Pod调度到与特定节点具有相同标签的节点上,而反亲和性规则可以将Pod调度到与特定节点具有不同标签的节点上。

  4. 互斥性:调度器可以实现Pod之间的互斥性,确保同一时间只有一个Pod运行在特定的节点上。这可以用于避免资源冲突或满足应用程序的特定需求。

  5. 负载均衡:调度器可以实现负载均衡,将Pod均匀地分布在集群的多个节点上,以实现资源的合理利用和提高应用程序的可用性。

  6. 调度策略:调度器支持多种调度策略,如优先级调度、节点亲和性、Pod亲和性、Pod反亲和性、Pod互斥性等。这些策略可以根据应用程序的需求和优先级,对Pod进行灵活的调度。

2.2 调度器的调度策略和算法

        调度器在将Pod调度到集群中的节点上时,使用一系列调度策略和算法来做出决策。这些策略和算法的选择可以根据集群的需求和配置进行调整。下面是一些常见的调度策略和算法:

  1. 优先级调度(Priority Scheduling):优先级调度是一种基于Pod的优先级属性来进行调度的策略。每个Pod都可以指定一个优先级,调度器会优先调度具有较高优先级的Pod。这可以用于确保重要任务的优先执行,或者确保关键应用程序的资源需求得到满足

  2. 节点亲和性(Node Affinity):用于指定Pod与特定节点之间的关系。通过标签选择器和节点选择器,可以将Pod调度到具有特定标签或属性的节点上。这可以用于实现Pod与特定节点的亲和性,例如将某些Pod调度到具有特定硬件设备或特定地理位置的节点上。

  3. Pod亲和性(Pod Affinity):用于指定Pod与其他Pod之间的关系。通过标签选择器和Pod选择器,可以将Pod调度到与其他Pod具有相同标签或属性的节点上。这可以用于实现Pod之间的亲和性,例如将具有相似功能或相互依赖的Pod调度到同一节点上。

  4. Pod反亲和性(Pod Anti-Affinity):用于指定Pod与其他Pod之间的关系的相反情况。通过标签选择器和Pod选择器,可以将Pod调度到与其他Pod具有不同标签或属性的节点上。这可以用于实现Pod之间的分散部署,增加容错性和可用性。

  5. Pod互斥性(Pod Taints and Tolerations):用于确保同一时间只有一个Pod运行在特定的节点上。通过在节点上设置特定的标记(Taint),只有具有相应容忍标记(Toleration)的Pod才能被调度到该节点上。这可以用于避免资源冲突或满足应用程序的特定需求。

  6. 负载均衡(Load Balancing):通过将Pod均匀地分布在集群的多个节点上,实现资源的合理利用和提高应用程序的可用性。调度器可以使用负载均衡算法(如轮询、最少连接等)来选择节点,以确保负载分布均匀。

        以上是一些常见的调度策略和算法。实际上,Kubernetes的调度器还支持自定义的调度策略和算法,可以根据特定的需求和场景进行扩展和定制。调度器的灵活性和可扩展性使得它能够适应各种不同的集群配置和应用程序需求。

三、控制器和调度器的协作

3.1 控制器与调试器的协作方式

        在Kubernetes中,控制器(Controller)和调度器(Scheduler)是两个独立但密切协作的组件,共同负责管理和调度Pod的生命周期。它们之间的关系和协作方式如下:

  1. 控制器的角色:控制器负责监控集群状态,根据用户定义的期望状态来维护和管理Pod的运行状态。它确保集群中的Pod按照用户的期望进行创建、更新和删除,并保持集群的期望状态与实际状态一致。

  2. 调度器的角色:调度器负责将新创建的Pod调度到集群中的合适节点上运行。它根据集群中节点的资源情况、Pod的调度要求和调度策略等因素,做出决策并将Pod分配给合适的节点。

  3. 协作方式:当用户创建一个新的Pod时,控制器会将Pod的定义信息存储在etcd等持久化存储中,并监控集群状态的变化。当控制器检测到新的Pod需要创建时,它会向调度器发送调度请求。

  4. 调度器的决策:调度器接收到调度请求后,会根据集群的状态和调度策略,对Pod进行调度决策。它会考虑节点的资源可用性、亲和性规则、互斥性规则和负载均衡等因素,选择最合适的节点来运行Pod。

  5. 调度器的调度结果:调度器根据调度决策,将Pod与目标节点的绑定关系信息存储在etcd中,并将调度结果返回给控制器。控制器根据调度结果,更新Pod的状态,并通知容器运行时(如Docker)在目标节点上创建和运行Pod的容器。

        通过这种协作方式,控制器和调度器实现了Pod的全生命周期管理。控制器负责维护期望状态和实际状态的一致性,调度器负责将Pod调度到合适的节点上运行。它们共同工作,确保集群中的Pod按照用户的期望和需求进行创建、更新和删除,实现高可用性、资源利用率和应用程序性能的优化。

3.2 控制器与调度器的交互

        在Kubernetes中,控制器(Controller)和调度器(Scheduler)之间通过以下方式进行交互和通信:

  1. API Server:控制器和调度器都通过Kubernetes API Server进行通信。API Server是Kubernetes集群的控制平面组件,它提供了与集群的交互接口。控制器和调度器通过API Server读取和写入集群状态的信息,包括Pod、节点、标签和事件等。

  2. Watch机制:控制器使用Watch机制来监视集群状态的变化。它向API Server发送Watch请求,以获取与其关联的资源(如Pod、节点)的变化通知。当Pod的状态发生变化时,API Server会将相应的事件通知发送给控制器。

  3. 调度请求:当控制器检测到新的Pod需要创建时,它会向调度器发送调度请求。控制器将Pod的定义信息传递给调度器,请求将其调度到合适的节点上运行。调度请求可以包括Pod的资源需求、亲和性规则、互斥性规则和调度策略等信息。

  4. 调度决策:调度器接收到调度请求后,会根据集群的状态和调度策略,做出调度决策。它会考虑节点的资源可用性、亲和性规则、互斥性规则和负载均衡等因素,选择最合适的节点来运行Pod。

  5. 调度结果:调度器根据调度决策,将Pod与目标节点的绑定关系信息存储在etcd等持久化存储中,并将调度结果返回给控制器。控制器根据调度结果,更新Pod的状态,并通知容器运行时在目标节点上创建和运行Pod的容器。

        通过这些交互和通信方式,控制器和调度器实现了协同工作,保证了集群的稳定性、可用性和性能。

四、控制器和调度器的使用建议

4.1 控制器的使用建议

  1. 使用适当的控制器类型:Kubernetes提供了多种类型的控制器,如Deployment、StatefulSet、DaemonSet等。根据应用程序的需求选择适当的控制器类型。例如,使用Deployment来管理无状态应用程序,使用StatefulSet来管理有状态应用程序。

  2. 设置合适的副本数:根据应用程序的负载和可用资源,设置合适的副本数。确保副本数足够满足应用程序的需求,并在需要时进行自动扩展。

  3. 使用滚动更新策略:在更新应用程序时,使用滚动更新策略来逐步替换旧的Pod。这样可以确保应用程序的可用性和稳定性,避免一次性替换导致的应用中断或系统故障。

  4. 监控和处理事件:控制器会生成与Pod和应用程序相关的事件。监控这些事件,并及时处理异常和故障。使用工具如Prometheus、Grafana等来监控控制器的状态和性能。

4.2 调度器的使用建议

  1. 调度策略的定制化:根据集群的需求和应用程序的特性,定制化调度策略。例如,通过标签和亲和性规则来约束Pod的调度位置,使用Pod反亲和性来避免Pod在同一节点上运行。

  2. 资源限制和配额管理:使用资源限制和配额管理来确保集群中的资源被合理分配和使用。调度器可以根据资源需求和限制来进行调度决策,避免节点过载或资源浪费。

  3. 负载均衡:调度器可以通过负载均衡策略来平衡集群中的负载。使用合适的负载均衡策略,将Pod均匀地分布在不同的节点上,避免节点的不均衡和过载。

  4. 节点亲和性和互斥性规则:利用节点亲和性和互斥性规则,将Pod调度到与其相关的节点上。例如,将具有相同标签的Pod调度到同一节点上,或将具有互斥标签的Pod调度到不同的节点上。

  5. 调度器插件的使用:Kubernetes提供了各种调度器插件,如Predicates和Priority Functions等。根据集群的需求和应用程序的特性,使用适当的插件来扩展和定制调度器的功能。

        控制器和调度器的使用涉及多个方面,包括控制器类型选择、副本数设置、滚动更新策略、调度策略定制、资源限制和配额管理等。根据具体的应用场景和需求,可以优化应用程序的部署和管理,提高集群的性能和可用性。

五、性能和可靠性优化

  1. 集群规模和资源管理:合理规划集群的规模和资源分配,确保集群具有足够的计算、存储和网络资源来支持控制器和调度器的正常运行。根据应用程序的需求和预期负载,调整节点数量、节点规格和资源配额,以避免资源瓶颈和过载。

  2. 控制器和调度器的水平扩展:根据集群的负载和性能需求,考虑将控制器和调度器进行水平扩展。通过增加实例数量来分担负载,并使用负载均衡策略将请求均匀地分发给多个实例。这样可以提高系统的吞吐量和并发处理能力。

  3. 监控和日志记录:设置监控和日志记录系统,实时监测控制器和调度器的性能指标和运行状态。使用工具如Prometheus、Grafana等来收集和可视化监控数据,及时发现性能问题和故障,并采取相应的措施进行调整和修复。

  4. 调度器策略的优化:根据应用程序的特性和需求,优化调度器的策略。考虑使用亲和性规则、节点标签、资源限制和优先级等,来确保Pod被调度到合适的节点上。定期评估和调整调度器的策略,以提高资源利用率和负载均衡效果。

  5. 故障恢复和容错机制:实施故障恢复和容错机制,以保证控制器和调度器的可靠性。使用健康检查和自动重启策略,监测和恢复控制器和调度器实例的健康状态。考虑使用备份和冗余机制,确保在单个实例故障时能够无缝切换到备用实例。

  6. 定期更新和升级:保持控制器和调度器的版本更新和升级。新版本通常会修复bug、改进性能和引入新功能。定期进行版本检查,并根据需要进行升级。确保在升级过程中采取适当的备份和回滚策略,以最小化潜在的中断和故障。

  7. 健康检查和自动恢复:为控制器和调度器设置健康检查和自动恢复机制。定期检查控制器和调度器的健康状态,并在发现异常时自动进行恢复。这可以包括重启实例、重新分配任务或启动备用实例等。

        持续监控和调整控制器和调度器的配置是保持系统高性能和可靠性的关键环节。通过实时监控、故障监测、日志记录和分析、自动化告警和通知、定期评估和调整,以及团队的培训和知识共享,可以及时发现和解决问题,优化配置和策略,从而提高控制器和调度器的性能和可靠性。

六、总结

        作为Kubernetes的两个重要组件,控制器和调度器之间具有互补的作用。控制器负责维护Pod的生命周期和应用程序的期望状态,而调度器负责将Pod调度到合适的节点上运行。控制器通过监控集群状态和处理事件,驱动调度器进行调度决策,并确保Pod按照用户的期望进行部署和管理。调度器根据控制器提供的调度请求和集群状态,做出调度决策并将调度结果返回给控制器,以实现Pod的正确分配和运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/270047.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

360压缩安装一半不动了怎么办?

360压缩软件是我们常用的压缩软件,但是常常会遇到压缩安装到一半停止的情况,下面提供了一些可能的原因和解决办法,大家可以进行尝试~ 方法一:关闭防火墙和杀毒软件 有时候,防火墙和杀毒软件可能会阻止360压缩的安装过…

使用ArcMap进行实测数据处理

文章目录 题目流程 题目 实验名称:实测数据处理 实验目的及要求: 1. 掌握实测点数据转为矢量点数据方法 2. 掌握数据投影变换方法 3. 掌握点数据插值方法 流程 1,打开ArcMap软件,在左菜单栏上选中File,然后鼠标移…

电脑开机快捷启动,启动菜单没有u盘怎么办

电脑开机快捷启动键找不到u盘怎么办 对于快捷启动键找不到u盘的问题,小编很了解其中的门道,因为开机找不到u盘是我们使用电脑时候的常见问题。那么我们到底要如何解决开机找不到u盘的问题呢?其实方法还是蛮简单的,下面小编就来教大家电脑开…

Maven高级篇

Maven依赖管理原则; 可选依赖:隐藏当前项目中的指定的包,如此,别的包引用当前包时,当前包中的指定包就被隐藏了,在别的包中无法看到隐藏的包 排除依赖:指定排除引用包中所包含的依赖,防止与当…

解决 Solidworks2021 报错(-15,10032,0)错误记录

Solidworks2021 报错"-15,10032,0"错误记录 如图所示解决方案步骤1步骤2 个人问题我的没法添加白名单,要是有能解决的大神给个解决方式感激不尽!! 如图所示 解决方案 步骤1 该问题的解决方式仅对个人有效,不一定通用&…

MY FILE SERVER: 1

下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 首先我们需要发现ip 我的kali是59.162所以167就是靶机的 然后我们拿nmap扫一下端口 nmap -sV -p- 192.168.59.167 扫完发现有七个端口开放 按照习惯先看80 没看到有啥有用信息,用nikto扫一下 nik…

[环境配置]win11关闭病毒和威胁防护防止乱删软件

选择桌面的开始图标,选择“设置”功能 点击隐私和安全性功能,进入“Windows安全中心” 点击开启Windows安全中心。 将实时保护和其他保护功能进行关闭就可以了。

jQuery实现layer.open中按钮倒计时读秒可用的协议阅读场景

今日遇到一个系统注册页网站 条款签接受流程改动的需求,往日多是使用他人网站注册登录,看见相关协议的授权设计大同小样,觉得挺有意思,这次遇到了需要我来实现这个功能,但是用习惯了vue的封装,这次是依靠jQ…

Arduino驱动BME680四合一传感器模块

目录 一、简介二、技术参数三、使用方法四、实验现象 一、简介 点击图片购买 GYMCU680 是一款低成本空气检测模块,工作电压 3-5v 功耗小,体积小。其工作原理,是通过 MCU 读取 BME680传感器数据,经过算法得到,温湿度&am…

【温故而知新】css提高性能的方法都有那些

前言 CSS(层叠样式表)是一种用于描述HTML(超文本标记语言)文档外观样式的语言。它定义了如何在网页中呈现元素的布局、颜色、字体、大小等属性。CSS文件通常与HTML文件分离,使得修改样式更加灵活和可维护。 CSS基于选…

浅谈师范双非普本工科专业的秋招历程

本人普通师范院校通信工程专业,于秋招历程之中四处碰壁,迫于家庭等各种因素考虑,最终选择移动的偏远县城岗位的OFFER!本人秋招历程之中,屡屡碰壁,也算得上“收获满满”!我简单给各位浅谈一下我的…

javaweb初体验

javaweb初体验 文章目录 javaweb初体验前言一、流程:1.创建Maven的父工程2.创建Maven,Webapp的子工程3.在pom.xml文件中添加依赖(父工程与子工程共用)4.写一个helloservlet类实现httpservlet接口,重写doget&#xff0c…

whistle网络监控 fiddler的开源替代

github源码:https://github.com/avwo/whistle 官网说明:http://wproxy.org/whistle/ windows/mac一键安装 先安装nodejs 然后运行命令 npm i -g whistle && w2 start --init启动 w2 start停止 w2 stop注意停止后要手动关闭代理服务器设置 w…

让学习成为一种生活方式:数字化助力终身学习

12月以来,“让学习成为一种生活方法”全民终身学习活动在北京、安徽、湖北、湖南、云南等地密集启动,而依托数字化赋能终身学习成为共同关键词。 近年来,随着教育现代化体系的不断深入推进,数字化转型成为建设高质量终身学习体系的重要“推动力”,数字技术与大数据的应用汇聚了…

第一次记录QPSK,BSPK,MPSK,QAM—MATLAB实现

最近有偶然的机会学习了一次QPSK防止以后忘记又得找资料,这里就详细的记录一下 基于 QPSK 的通信系统如图 1 所示,QPSK 调制是目前最常用的一种卫星数字和数 字集群信号调制方式,它具有较高的频谱利用率、较强的抗干扰性、在电路上实现也较为…

Vue3设计目标和优化

vue3.0的设计目标是什么?做了哪些优化? Vue3的设计目标:更小、更快、更友好、优化方案 一、设计目标 Vue3之前我们会面临的许多问题: 随着功能的增长,复杂组件的代码变得越来越难以维护起来缺少一种比较【干净】的…

Redis基础-Redis概念及常见命令

1.nosql数据库 NoSQL数据库是一种提供了非关系型数据存储的数据库系统,与传统的关系型数据库(如SQL数据库)不同。NoSQL数据库的特点是灵活性高,能够处理结构化、半结构化或非结构化数据。它们通常用于大数据和实时Web应用。NoSQL数…

平衡二叉树的构建(递归

目录 1.概念:2.特点:3.构建方法:4.代码:小结: 1.概念: 平衡二叉树(Balanced Binary Tree),也称为AVL树,是一种二叉树,它满足每个节点的左子树和右…

如何分析 JVM 内存瓶颈浅谈

背景: 当操作系统内存出现瓶颈时,我们便会重点排查那个应用占用内存过大。对于更深一步分析内存的使用,就进一步去了解内存结构,应用程序使用情况,以及内存如何分配、如何回收,这样你才能更好地确定内存的…

图像九宫格切分1x3、3x3 Python

文章目录 1、需求2、实现2-1 贴图、切分2-2 GUI 3、运行效果4、代码 1、需求 把一个图像切分成 1x3 或者 3x3切分出来的图像比例希望都是 1:1 正方形如果图像尺寸满足 切分条件,自动填充一些“白边”然后继续切分如果填充了白边的话,希望能够调整原图像…