理解 Kubernetes 中的 CPU 资源分配机制

Kubernetes(k8s)是一种流行的容器编排平台,它允许开发人员在云环境中部署、管理和自动化容器化应用程序。在 Kubernetes 中,CPU 资源的分配是一个关键的问题,它直接影响着应用程序的性能和可靠性。本文将介绍 Kubernetes 中的 CPU 资源分配机制,包括 CPU 请求和限制、CPU Share 机制以及 CPU 调度器等相关概念,以帮助开发人员更好地控制容器的 CPU 分配,从而提高应用程序的性能和可靠性。 CPU 分配单位 在 Kubernetes 中,CPU 的分配单位是 millicpu(毫核),一个 CPU 资源等于 1000 毫核。例如,一个 Pod 请求 0.5 个 CPU 资源,可以表示为 500 毫核。它是基于 Linux 内核的 CPU 分配机制实现的。在 Linux 内核中,CPU 时间是以时间片的形式分配的,每个时间片通常为几毫秒。Kubernetes 利用这个特性,将 CPU 时间片分配单位转换为毫核。 CPU 资源分配机制 在 Kubernetes 中,CPU 资源的分配是通过两种方式来实现的:CPU 请求和限制。CPU 请求用于告诉 Kubernetes 调度器,该 Pod 至少需要多少 CPU 资源才能正常运行;CPU 限制用于告诉 Kubernetes,该 Pod 最多可以使用多少 CPU 资源。如果节点上可用的 CPU 资源不足以满足 Pod 的 CPU 请求,该 Pod 就无法调度到该节点上运行。如果节点上可用的 CPU 资源不足以满足 Pod 的 CPU 限制,该 Pod 仍然可以运行,但可能会受到 CPU 资源的限制,导致运行缓慢或者出现其他问题。 需要注意的是,CPU 请求和限制是 Kubernetes 中的两个独立的概念。通常情况下,应该根据应用程序的实际需求来设置 CPU 请求和限制。如果设置的 CPU 请求过低,可能会导致 Pod 无法正常运行或者运行缓慢;如果设置的 CPU 限制过高,可能会导致节点上的其他 Pod 的 CPU 资源不足,影响整个集群的性能和可用性。 ...

六月 20, 2023

TransRepair: Automatic Testing and Improvement of Machine Translation(机器翻译的自动化测试和改进)

最近,我阅读了一篇名为 TransRepair: Automatic Testing and Improvement of Machine Translation 的研究论文。该论文介绍了一种名为TransRepair的方法,用于在软件测试领域下自动测试机器翻译模型。下面,我将从几个方面对论文的内容进行总结,并讨论其中的关键点。 TransRepair简介 TransRepair是一种用于自动检测和修复机器翻译软件一致性问题的方法。它提供了黑盒和灰盒两种方法来解决机器翻译软件的一致性问题。TransRepair的主要步骤包括生成测试用例、创建测试准则和自动修复过程。该方法提供了清晰、严谨和详细的测试用例生成算法,并采用了四种句子差异的量化方法进行比较。此外,TransRepair还运用了结构一致性原理作为断言,并提供了全面的实验设计和多样化的结果。 关键问题的理解 一致性问题是指机器翻译软件在处理一组具有相似语义和结构但某些特定词语上略有不同的句子时,在对应翻译句集合中的某一句或几句中的某个或几个部分出现的语义、结构不一致的现象。 TransRepair生成测试用例的方法是对输入的原句进行词语替换,形成突变句组。为了实现这一操作,TransRepair使用了词向量模型来计算词语之间的关联性。在选择候选词后,还会将其带入句子中进行成分分析,以确定句子的语义和语法是否发生较大变化。 在验证测试用例输出句子对的一致性时,TransRepair首先使用Widiff进行字符串成分的差异性比较分析。为了增强相似度量化的可靠性,TransRepair还构造了原句和翻译句中涉及的差异成分的部分删除集合,并计算集合中每个元素之间的相似度,选择最大相似值。论文中使用了四种不同的方法来量化相似度,其中部分方法与之前提到的SIT方法有相似之处。 论文中的实验设计具有独特的特点。它首先提出问题并对解决方法进行探讨,然后围绕这四个问题设计实验并提供适当形式的实验数据。实验从多个角度论证了该方法的有效性,包括准确度、有效性、修复能力以及与人工方式的对比等。实验数据的呈现直观易懂。 TransRepair在处理阈值上与SIT方法不同。它通过机器小步遍历运算来获得统计上最优的阈值,并采用人工辅助和统计学分析的方式进行一致性判别,其阈值设定逻辑更具说服力。而SIT方法的阈值设定大多依靠经验,说服力和可操作性较低。 在TransRepair中,自动修复可以分为黑盒和灰盒两种方式。黑盒对应于Google Translate,由于该软件未开源,对于输入输出的相关参数了解有限,因此只能对输入和输出本身进行操作。灰盒对应于Transformer,它的源码和训练集可获取,因此可以对其输出结果的可能性进行把握,并在训练集和模型结构上进行修复操作。 TransRepair的优势在于对一致性问题的自动检测和修复。该方法具有高准确度、可行性和可复现性,这与其准确的实施方法以及对现有方法缺陷的考虑和补充密切相关。然而,该方法的效率较低,有效性仅限于一致性问题。 总体而言,论文 TransRepair 介绍了TransRepair方法作为一种有效的自动测试和改进机器翻译软件的方法,特别解决了一致性问题。论文详细解释了该方法,并提供了实验证据和比较分析。

九月 30, 2021

Structure-Invariant Testing for Machine Translation (SIT) 论文阅读总结

我之前阅读了 Structure-Invariant Testing for Machine Translation 这篇论文,它提出了一种关于机器翻译软件系统鲁棒性问题的检测方法。下面我将从几个方面详细介绍我对其中内容的理解。 主要内容 SIT是关于机器翻译软件系统鲁棒性问题的检测方法。这种方法利用了一个蜕变测试中的蜕变关系,即"结构不变性"。通过选择原始句子、生成相似句子、从翻译软件获取结果、进行成分解析并量化句子差异、根据设定的阈值筛选并发现问题,SIT可以高效地检测出机器翻译软件系统的鲁棒性问题。根据实验结果,SIT在19秒内可以处理2k+句子,并且对于Google/Bing Translate的准确度达到了70%。然而,仍有提升的空间,可能是由于阈值选择的原因。 对几个关键问题的理解 为什么机器翻译软件存在鲁棒性问题? 机器翻译软件系统的核心模块通常采用深度学习方法或技术。深度学习模型中每层的维度较高,导致训练模型在向量空间中对不同标签区域的界定可能模糊不清。当输入值接近边界时,稍微做出微小改变可能导致模型输出剧烈变化。 什么是结构不变性? 结构不变性是指经过对某种语言的句子进行一些特定且微小的词单位修改后,其语义和语法上的结构在转换为对应翻译后通常保持不变。结构不变性是研究机器翻译软件系统相关问题的经验和统计学意义上的一个切入点。 为什么要引入结构不变性? 引入结构不变性是为了进行蜕变测试,以探索机器翻译软件系统的鲁棒性问题。引入结构不变性的目的有两个:一是由于自然语言关系和变化复杂多样,难以得到一种通用的测试定理作为基准进行测试,因此通过控制变量,得到类似于经验或统计意义上正确的起点,展开测试研究;二是自然语言相关测试的测试用例难以人工构建,引入结构不变性可以方便地利用现有少量样本生成大量测试用例。 如何利用结构不变性生成语义与语法相似的语句? 在SIT中,使用了BERT模型来生成语义与语法相似的语句。SIT依赖于BERT的大型语料训练以及遮罩和双向反馈学习等技术,以抑制词语替换后整个句子的语义改变或不符合语法和使用习惯等问题。SIT通过在BERT之后增加一个轻量级的分类器来辅助生成预备替换词语的候选列表。 如何量化句子的差异以判断机器翻译软件系统是否存在鲁棒性问题? SIT使用了三种方法来量化句子差异:字符串差异分析、成分解析树分析和依存解析树分析。SIT直接对翻译软件的输出结果进行以上三种分析,并对它们的效果进行比较。然而,这三种句子差异分析方法都有一定的局限性,可以在进一步的工作中探索综合使用这三种方法进行判定的方式。 SIT具有哪些优势?有哪些不足? 在论文中,作者讨论了SIT的优势和不足。总的来说,SIT的优势在于其能够检测多种类型错误(未翻译、过度翻译、错误调整、逻辑不清)。然而,我认为其测试用例的生成方式、错误量化和检测方法相对粗糙,导致实验下准确性并不高。修复和阈值设定需要人工参与,这也是其另一个不足之处。 SIT可以有哪些应用? SIT主要应用于对运用了AI模型的机器翻译软件系统进行鲁棒性测试。通过SIT的自动检测和人工修复训练样本,机器翻译软件的鲁棒性可以得到提升。 总结 SIT是一种检测机器翻译软件系统鲁棒性问题的方法。通过选择原始句子、生成相似句子、获取翻译结果、进行成分解析和量化句子差异,SIT可以高效地检测机器翻译软件系统的鲁棒性问题。实验结果显示,SIT可以在19秒内处理2k+句子,并且对于Google/Bing Translate的准确度达到了70%。然而,仍有改进的空间,可能是由于阈值选择的原因。SIT利用BERT模型生成语义和语法相似的语句,并使用三种方法来量化句子差异。总体而言,SIT的优势在于能够检测多种类型的错误,但其测试用例生成方式和检测方法仍有改进空间。SIT主要应用于对应用AI模型的机器翻译软件系统进行鲁棒性测试,并通过自动检测和人工修复训练样本来提升鲁棒性。

九月 30, 2021

掌握C++右值引用的十大要点:如何正确处理纯右值和将亡值

最近由于工作需要,我阅读了很多关于C++右值方面的材料。在C++中,右值是一个非常重要的概念,它对于理解C++的内部机制和实现高效代码至关重要。本文将总结了10个关于右值的实践经验。 C++右值有两种:纯右值、将亡值。右值引用可以延长将亡值的生命周期,使得将亡值能够被正常使用,而不会被错误地释放。 右值引用的一个作用是延长右值的生命周期。右值引用可以延长将亡值的生命周期,使得将亡值能够被正常使用,而不会被错误地释放。 临时对象作为右值处理。这种对象往往会在一些表达式中自动创建,然后被立即使用。使用右值引用来绑定临时对象,可以让程序更高效地处理这些对象,避免了不必要的内存拷贝操作。 移动构造函数尽可绑定右值非常量。这是因为右值非常量可以被修改,而右值常量则不能。移动构造函数会破坏源对象,所以只有右值非常量才能被移动构造函数绑定。 对于一个右值对象,允许调用成员函数。这与左值对象类似。但需要注意的是,对于一个将亡值,如果其生命周期结束,那么调用其成员函数可能会导致程序出现未定义行为。 右值可以被修改(这也说明了其可以被破坏)。因此,在使用右值时需要谨慎处理,以避免因为修改了右值而导致程序出现问题。 右值不能当作左值使用,左值可以当作右值使用。这是因为左值具有实际地址,并且与右值有同样地表现。 常量左值引用可以绑定到右值。这种引用可以避免将右值对象修改的风险,同时还可以延长右值的生命周期,使其能够被正常使用。 返回右值引用的函数在几乎所有情况下是糟糕的。因为返回右值引用往往会导致右值的生命周期延长,从而使其可能被错误地使用。对于返回右值的函数,建议使用值返回的方式。 在大部分情况下return中使用是std::move并不会将事情变得更好,相反该操作会阻止编译器进行返回值优化。

九月 30, 2021

探究计算机中断处理:了解Intel x86处理器下的外部中断、异常和陷入

处理器中断处理是计算机体系架构中必须掌握的知识之一。在Intel的x86处理器下,中断可以分为外部中断、异常和陷入。外部中断来自硬件,是随机发生的,而异常则是处理器内部执行指令过程中检测到错误条件的结果。陷入则是由程序产生的,通常是由INT n、INTO等指令触发的。 在x86处理器中,中断处理程序负责处理中断,异常处理程序负责处理异常,而系统调用服务程序则负责处理陷入。这些处理程序可以位于内存空间的任何位置,并且可以有不同的特权级。Intel处理器使用中断门、陷阱门和任务门来定义处理程序的入口地址。其中,中断门和陷阱门是进入异常处理程序的门户。选择符和偏移量合起来定义了一个处理程序的入口地址。中断门进入处理程序时IF标志被清掉,而陷阱门进入处理程序时IF标志保持不变。 Intel处理器为每个中断和异常定义了一个中断向量号,并通过中断描述符表(IDT)建立中断向量号和门之间的对应关系。IDT可以驻留在线性地址空间的任何位置。Intel处理器专门提供了一个IDTR寄存器来记录IDT的基地址和界限信息。Intel处理器定义了256个中断向量号,其中0~31被处理器保留。 处理器中的异常可以分为故障类异常和终止类异常。故障类异常可以被更正,而终止类异常则是无法被处理器自行解决的严重错误。为了保证安全性,通过中断门或陷阱门只能向同级或更高特权级的代码段转移控制。通常情况下,处理程序定义在内核代码段中(0特权级代码段)。 在中断发生时,处理器会自动在栈顶压入一些参数,其中EFLAGS是中断或异常发生前的系统状态,SS:ESP是中断或者异常发生前用户堆栈的栈顶,CS:EIP是中断或者异常的返回地址。64位模式中,处理程序必须在64位代码段中,因而中断和陷阱门描述符被扩充到了16字节,其中偏移量被扩充到了64位;IDT找那个仅有新格式的门描述符;堆栈宽度变成了64位,而且当中断发生时,会无条件地压入栈指针(SS:RSP)当需要切换堆栈时SS被强制设置为NULL;新增了中断堆栈表(IST)机制,允许特定的中断或者异常指定专门的堆栈。

九月 30, 2021

Intel x86处理器内存保护 概要知识点

一旦处理器内存保护机制被启动,处理器就会对每一次内存访问进行保护性检查,以确保所有的访问都满足保护策略。保护检查和地址转换是并行进行的。 保护检查包含段级检查和页级检查。检查顺序是先段后页,检查依据是段描述符,页目录和页表,检查的基础是特权级。 特权级是Intel为实现保护而定义的特权编号。 段一级的检查包括段界限检查,段类型检查,特权级检查,长指针检查等。段一级检查的原则是: 低特权级的代码不能访问高特权级的数据 高特权级的代码可以访问低特权级的数据 代码只能使用与其特权级相同的堆栈,当特权级切换时,堆栈也要随之切换。 只能向具有相同特权级的非相容代码段转移控制(长JMP和长CALL) 可以向同等或者较高特权级的相容代码段转移控制,但不能向低特权级的相容代码段转移控制(长JMP和长CALL)。 即使调用门、中断门、陷阱门,也不能从高特权级向低特权级转移控制。 不允许使用长RET向高特权级转移控制。 页一级的检查包括特权级检查和读写检查。相关标志是页目录/页表项中的U/S和R/W位。U/S位0的页是超级页,为1是代表用户页。一般情况下,超级页中的代码可以访问所有页(不管R/W标志),用户页中的代码只能访问用户页。当CR0.WP被设置为1时,超级页中的代码也不能写只读用户页。 NXB为1的页只能用作数据页,试图执行数据页的指令会引起处理器异常。

九月 30, 2021

intel 64 体系常见内存管理方式

内存管理是操作系统中非常重要的一个部分。随着计算机技术的不断发展,内存管理的方式也在不断演变。本文将介绍 intel 64 体系几种常见的内存管理方式。 平板式内存管理是一种比较简单的内存管理方式。它采用页式管理,屏蔽掉段式管理。具体来说,它将逻辑地址直接映射为线性地址,定义一个代码段和一个数据段,两个段的大小都是4GB。这种方式的好处是简单易懂,但是它的缺点是不能进行多进程的内存隔离。 为了解决多进程内存隔离的问题,可以采用保护平板式内存管理的方式。具体来说,它定义了内核代码段、内核数据段、用户代码段和用户数据段,每个段的基地址都是0,大小为4GB。进程执行内核代码时使用内核段,执行用户代码时使用用户段。这种方式的好处是可以进行多进程的内存隔离,但是它的缺点是需要进行地址转化,影响效率。 多段式内存管理是一种完全采用段式管理的方式,屏蔽掉页式管理。它可以进行多进程的内存隔离,但是需要进行地址转化,也会影响效率。 基于物理地址拓展的页式内存管理是一种支持更大物理地址空间的方式。它引入了物理地址拓展(PAE)机制以支持36位物理地址。该管理模式中,物理地址空间被扩充到了64GB,但线性地址空间仍然为4GB。页目录和页表项被扩充到了64位,因而一个页目录或者页表中的项数变成了512,一个页目录仅能描述1GB线性地址空间。所以引入了一个只有四个表项的页目录指针表(PDP)。CR3指向PDP。地址转换机制被修改。当页目录项中的PS位被设置为1时,它描述的页变成了2MB页。 在64位模式中,段通常被关闭,不再做段界限检查。CS,DS,ES,SS的基地址处理器统统看作0。但FS和GS可以不是0,将逻辑地址转换为先行地址的时候要加上FS或者GS的基地址。FS和GS的基地址位64位地址,兼容模式中只使用它的低32位,记录在MSR中。在64位模式中,对于内存的管理完全依靠分页机制。Intel64体系结构扩展了PAE机制,使之能够支持64位线性地址和52位物理地址。拓展包括: 页目录指针表被扩充到了512项。 引入了一个第四级页映射表PML4,它的每一个表项可以指向一个PDP。 所有的四级页表表项被扩充到了64位。 页目录项中的PS标志用于控制4KB和2MB页。 所有页表项在第63位上新增了一个执行禁止标志EXB。

九月 30, 2021

段页式内存管理概要

段页式内存管理中,段的线性地址被分割成大小相等的线性页(4KB,4MB或者2MB等)。物理内存空间同样也被分成相同大小的物理页。操作系统维护一个页表,用于管理线性页到物理页的映射。页表在IA-32体系结构中分为两级,即页目录和页表 页目录是一个数组,其元素叫做页目录项(PDE),每个页目录项描述一个页表。页目录的大小为一页(4KB),一个页目录中有1024个页目录项。页目录项的大小为4字节。页表大小为一页(4KB)。页表项的大小为4字节,所以一个页表最多可以描述1024个线性页。 物理页是预先划分好的,其开始位置一定在4KB(2^12)的边界上。所以低12位全部是零。然后低12位就可以储存而外的信息。 P是存在位。R/W是读写标志位。U/S是用户标志位,0表示超级用户。A是存取标志位。D是脏标志位。 在页目录项中PAT标志换成了PS标志,表示物理页尺寸。 CR3寄存器专门存放当前使用的页目录的物理地址,因此CR3又叫做页目录基地址寄存器。只要进程在活动,它的页目录就应该一直驻留在内存。 页目录项也可以直接指向物理页,加快地址转换速度,通常将操作系统内核所占用的页设置为4MB页。该页目录项的PS地址为1事,它所描述的是一个4MB的页而不再是一个页表。 页式管理机制是操作系统内核启动的,启动方法是将CR0中的PG标志设置为1。 启动分页机制后,每个线性地址都需要经过页目录和页表的转换。IA-32体系结构加入了一个高速缓存TIB,其中储存最近使用的页目录和页表项。TIB的经常的刷新工作由操作系统内核负责。当页目录和页表项改变时,内核必须使得TIB相应的项失效。当CR3改变时,TIB中的所有内容(Global页除外)会自动失效。INVLPG指令可以将TLB中的指定项设置为无效。

九月 30, 2021

段内存管理概要

IA-32体系中提供了段页式内存管理机制,先分段再分页。提供页式是为了支持虚拟内存。 段:处理器的可寻址的线性内存空间被划分成了若干个大小不同的段。一个段是线性地址空间中的一个连续的区间。段中可保存代码、数据、堆栈或者其他数据结构。段的属性信息由与之对应的段描述符描述。段描述符是一个数据结构。Intel用段描述符表来管理。段描述符表最大可达64KB。 当G为0时,段以字节为单位,最大的段长为1MB。当G为1时,段以页(4kb)为单位。最大的段长为4GB。 DPL是段的特权级,其值在0~3之间。 S是系统标志,用于区分段的类别。0表示系统段,1表示用户段。 Type是段的类型: 对于系统段。类型域由4位组成,可表示16个系统段类型之一。 对于用户段。 第三位为0表示数据段,此时第二位表示地址的拓展方向(0表示大扩展方向),第一位表示段是否可写。 第三位为1表示代码段,此时第二位是相容标志(0表示非相容)。第一位是可读位。 第0位是存取位。0表示段尚未存取过。 D/B标志表示有效地址和操作数长度。 L标志仅出现在IA-32e模式的代码段中。1表示64位模式 堆栈段通常是向下扩展的、可读写的数据段。 段描述符表: 全局描述符表(GDT)。在系统进入保护模式前必须为其定义一个GDT。IA-32体系结构专门定义了一个GDTR寄存器来存放当前的GDT的信息。 局部描述符表(LDT)是系统段,其中可以存放局部描述符,如进程自己的代码段,数据段等。IA-32体系专门提供了一个LDTR寄存器,用于保存当前使用的LDT信息。 可以用段描述符在段描述符表中的索引来标识它,标识称作段选择符。段选择符是16位标识符。第二位是指示器(TI)表示索引所对的描述符表(0表示GDT)。第3-15位示索引,标定位置。第0、1位是请求特权级RPL。一个段选择符加上一个偏移量可以唯一地标识一个逻辑地址。逻辑地址是程序使用的地址,不是线性地址,也不是物理地址。 IA-32体系提供了6个段寄存器,即CS,SS,DS,ES,FS和GS。每一个段寄存器可以缓存一个段描述符。

九月 30, 2021

了解计算机系统内部运作:内存、I/O设备、总线和外存是如何协同工作的?

内存是处理器可以直接访问的储存空间。为了加快内存访问速度,计算机系统中通常提供了一些高速缓存(Cache),高速缓存通常由硬件管理。 I/O设备由I/O控制器和物理设备组成,处理器通过I/O控制器管理物理设备。I/O控制器主要由控制与状态寄存器(CSR)和数据寄存器组成。处理器通过读CSR来获得设备状态,通过写CSR来控制设备动作,通过读写数据寄存器来交换数据。内核通常将I/O设备抽象成一组寄存器,并给一个寄存器一个I/O地址。处理器通过I/O地址访问I/O寄存器。 现代计算机系统中许多设备寄存器可以被映射到物理地址空间中。此时,每个设备寄存器都有一个物理内存地址。这种方式的I/O称为内存映射I/O。使用方便但是会消耗物理内存地址。 通常把外存抽象成一个数据块的数组,每个数据块都有一个序号处理器可以通过序号随机读、写外存中的任何一个数据块。对于外存的操作通常以块为单位,因此又称外存为块设备。对应地,其他I/O设备称为字符设备。简而言之,块设备以块为单位进行数据的读写操作,如硬盘、闪存等;字符设备以字符为单位进行数据的读写操作,如键盘、鼠标、打印机等。 总线负责将处理器,内存,I/O控制器连接起来。常用的总线有ISA、PCI、PCI-E、AGP、ATA、SCSI等。总线还负责检测,枚举接在其上的设备。

九月 30, 2021