关于磁盘:NTFS磁盘在Mac上不能读写Tuxera-NTFS-2021可以解决
Tuxera NTFS 2021 mac中文版是一款十分好用的NTFS读写工具,能够让您残缺的读写兼容NTFS格局驱动器,对磁盘进行拜访、编辑、存储和传输文件等操作。同时还包含开源磁盘管理器等简略的格局和硬盘培修检查和修复。 装置Tuxera NTFS
Tuxera NTFS 2021 mac中文版是一款十分好用的NTFS读写工具,能够让您残缺的读写兼容NTFS格局驱动器,对磁盘进行拜访、编辑、存储和传输文件等操作。同时还包含开源磁盘管理器等简略的格局和硬盘培修检查和修复。 装置Tuxera NTFS
能够 WGCLOUD监控平台反对监测硬盘的温度,通电次数,通电工夫,衰弱状态 如下图
在企业数字化转型的浪潮下,数据正成为企业外围资产甚至“命门”,数据安全的重要性显而易见。可是即使企业对数据安全高度重视,简直每年还是会产生震撼业界的数据失落大事件:比方2017年5月“永恒之蓝”勒索病毒暴发事件、2018年7月某企业私有云数据失落事件以及2020年2月某公司运维删库的事件。导致这些事件的起因或是“外有强敌,内有忧患”,或是企业在私有云上的业务只做单点部署而漠视了潜在的数据安全危险。可见,数据安全真正落地的难度十分大,这是一个系统性工程。 作为一家中立的云计算公司,UCloud深刻理解用户对数据安全的器重,始终将用户的数据安全防护放在首位,在2015年推出了为云主机磁盘提供继续数据保护(CDP)的数据方舟(UDataArk),反对最小准确到秒级的复原,针对数据删除或者失落,可能最大水平的挽回数据。数据方舟曾经在多个数据安全案例中失去利用,并失去了泛滥用户的认可。 近些年,随着用户高性能存储场景的需要增多,SSD云盘和RSSD云盘成为支流抉择, 但因为数据方舟次要针对本地盘及一般云盘的备份,SSD云盘和RSSD云盘不足高效的备份伎俩成为用户痛点。为此咱们推出了磁盘快照服务(USnap),USnap基于数据方舟CDP技术并进一步降级,以更低的老本为全系列云盘(一般/SSD/RSSD)提供了数据备份性能,当用户为一块云盘开启磁盘快照服务后,该磁盘不仅能够取得对应的手动快照额度,还能取得最近3日间断数据主动备份性能。 在线实时主动备份,可准确到秒级 USnap备份时无需暂停业务或进行磁盘读写,不影响线上业务,不损耗磁盘I/O性能。USnap不仅提供肯定的手动快照额度,还为用户提供了最近3日内的间断数据主动备份,反对复原到12小时内任意一秒、24小时内的任意整点以及3天内的任意零点。用户无需手动制作快照,也无需预设数据备份策略,即可取得最小准确到秒级的数据备份。对于局部用户对主动备份的工夫范畴有着更长的需要,咱们还提供了自定义主动备份工夫范畴的增值服务,用户能够设置秒级、小时级、天级的爱护范畴,线上咱们曾经为某些用户提供了最长达到30天的主动备份服务。 异构数据备份零碎,数据安全降级 USnap应用独立的集群进行数据备份,与云盘集群异构。即便遭逢云盘集群呈现故障而导致数据失落的极其事件,用户仍能从备份数据集群中复原数据,防止了相似某企业在私有云的业务只做了单点部署,在遭逢了“黑天鹅”后呈现数据齐全失落的惨痛教训。而且备份数据集群没有对外裸露数据删除接口,即使USnap服务被敞开,备份数据依然会保留3天,如果呈现相似某公司的运维删库事件,用户能够更快更不便的复原数据。 备份应用形式灵便,满足多场景需要 用户能够在线开启USnap,无需进行业务。当用户应用USnap的手动备份或主动备份复原磁盘时,数据会复原到一块新的磁盘上,如果复原后用户反悔,能够疾速取回复原前的数据。用户还能够通过克隆的形式,从USnap的手动备份或主动备份中创立出一块新的磁盘,不便查看备份数据,且克隆的数据源为备份数据集群,齐全不影响以后的虚拟机运行。 自研存储引擎优化,升高用户备份老本 尽管CDP产品齐全突破了传统备份周期概念,打消了备份窗口的解放,然而备份老本较高始终是一个痛点。USnap全面降级了数据方舟底层架构,引入了更加高效数据压缩算法,并且自研了相干数据重删技术,大大降低了数据备份老本。绝对于数据方舟产品,USnap的价格直降50%,低至0.2元/GB/月,爱护外围的数据资产,1TB每日只需6元! USnap典型利用场景 1、容灾备份 利用快照定期备份重要的业务数据,以应答误操作、攻打或病毒等导致的数据失落危险。 2、数据疾速复原 在更换操作系统、降级应用软件或迁徙业务数据等重大操作前,创立一份或多份快照。若在变更操作过程中呈现任何问题,可通过已创立的快照及时复原业务数据。 3、数据开发 通过创立生产数据快照,为数据挖掘、报表查问和开发测试等利用提供近实时的实在生产数据。 大数据时代,数据是企业的外围生产因素,USnap是为保障数据安全构筑的一道重要防线:主动的备份策略,能够躲避因为用户安全意识缺失、制度缺失带来的数据危险;最小准确到秒级的数据备份点,在呈现数据毁坏和失落时可能最大水平的挽回数据;更低的备份老本,让用户享受更先进技术带来的价格红利。当初USnap曾经在北京、上海、广州、香港、华盛顿及法兰克福地区全面上线,为您的数据保驾护航!
清除CentOS 6或CentOS 7上的磁盘空间以下是清除CentOS 6或CentOS 7服务器上的磁盘空间的快速命令。首先需要安装yum-utils包: yum -y install yum-utils1.修剪日志文件find /var -name "*.log" ( ( -size +50M -mtime +7 ) -o -mtime +30 ) -exec truncate {} --size 0 ;这将截断*.log卷/var上超过7天且超过50M或超过30天的所有文件。 2.清理YUM缓存清理yum缓存很简单: yum clean all请注意,上面的命令不会删除yum已安装的与之相关的所有文件。您可能希望释放禁用或删除的存储库中的孤立数据占用的空间: rm -rf /var/cache/yum此外,当您意外地yum通过普通用户(忘记sudo)时,yum将创建用户缓存。所以我们也删除它: rm -rf /var/tmp/yum-*3.删除孤儿包检查现有的孤儿包 package-cleanup --quiet --leaves --exclude-bin确认删除孤立包现在,如果对上一个命令给出的建议感到满意,请运行: package-cleanup --quiet --leaves --exclude-bin | xargs yum remove -y4.删除 WP CLI 缓存的 WordPress 下载每次设置新的 WordPress 网站时,WP CLI都会保存 WordPress 存档。您可以通过以下命令删除这些缓存: rm -rf /root/.wp-cli/cache/*rm -rf /home/*/.wp-cli/cache/*5.删除旧内核在删除旧内核之前,您可能希望先重启,以便从最新内核启动。因为你无法移除当前引导系统的旧内核???? ...
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。 fio 官网地址:http://freshmeat.net/projects... 1.FIO安装wget http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz yum install libaio-develtar -zxvf fio-2.2.5.tar.gzcd fio-2.2.5makemake install2.FIO用法a) 随机读 (可直接用,向磁盘写一个2G文件,10线程,随机读1分钟,给出结果) fio -filename=/tmp/test_randread -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest参数说明 filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。rw=randwrite 测试随机写的I/Orw=randrw 测试随机写和读的I/Obs=16k 单次io的块文件大小为16kbsrange=512-2048 同上,提定数据块的大小范围size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。numjobs=30 本次的测试线程为30.runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。ioengine=psync io引擎使用pync方式rwmixwrite=30 在混合读写的模式下,写占30%group_reporting 关于显示结果的,汇总每个进程的信息。其他参数 lockmem=1g 只使用1g内存进行测试。zero_buffers 用0初始化系统buffer。nrfiles=8 每个进程生成文件的数量。rw=read/write/readwrite 顺序读/顺序写/顺序混合读写rw=randread/randwrite/wandrw 随机读/随机写/随机混合读写b) 顺序读 fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytestc) 随机写 ...
转载请注明文章出处:https://tlanyan.me/veracrypt-…VeraCrypt介绍VeraCrypt是一款开源的磁盘加密软件,前身是大名鼎鼎的TrueCrypt。2014年5月微软停止Windows XP的支持,TrueCrypt的作者认为Win7及后续版本内置的BitLocker足够好用,TrueCrypt不再那么必要,于是同月停止了TrueCrypt的开发。目前TrueCrypt的官网永久重定向到TrueCrypt的Sourceforge项目主页,并警告用户TrueCrypt含有未修复的安全漏洞,应该尽快将TrueCrypt加密的数据迁移到其他工具。VeraCrypt由IDRIX开发和维护,基于TrueCrypt 7.1a版本。2013年6月VeraCrypt发布初始版本,2016年进行了安全审计,最新版本是2018年9月23号发布的1.23。VeraCrypt支持Windows、MacOS和Linux平台,暂不支持安卓和iOS。相对于其他磁盘加密软件,VeraCrypt的优势在于:开源,活跃开发中。TrueCrypt的另一个分支CipherShed基本已暂停开发;跨平台,支持PC上的主流操作系统。对比之下BitLocker官方仅支持Windows、eCryptfs只支持Linux;安全,2016年由专业机构对VeraCrypt进行安全审计,发现多个高危漏洞并进行了修复;功能强大。既支持文件容器的加密、卷隐藏,也支持分区/设备加密,Windows下还支持系统盘启动加密。VeraCrypt安装VeraCrypt的源码托管在官网、Sourceforge、GitHub等多个网站上。发布的版本及可执行文件可从lauchpad、Sourceforge等网站下载。官网的Windows版本下载地址是https://launchpad.net/veracry…(launchpad下载地址)。下载exe后点击安装即可。其他操作系统的下载地址请访问官网。VeraCrypt使用Windows上,VeraCrypt支持三种加密方式:加密文件卷;加密非系统分区/设备;加密系统分区/设备。非Windows操作系统不支持对系统所在设备加密。下文基于Windows分别对三种加密进行说明。加密文件卷通俗的理解,加密文件卷是一个加密的压缩文件或者ISO文件。没有解密的文件卷是一个普通的文件,允许任何有效的文件名后缀,往文件卷读写文件时需先挂载。接下来图文结合展示加密文件卷的创建和使用。启动VeraCrypt后,点击“创建加密卷”,在弹出来的引导界面中选择“创建文件型加密卷”:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“900” height=“585” class=“aligncenter size-full wp-image-3173” />点击“下一步”进入加密卷类型选择界面。标准加密卷是文件夹中的一个文件,隐藏加密卷是加密卷中的隐藏文件。关于隐藏加密卷和隐藏分区在后文备注,这里我们选择“标准VeraCrypt加密卷”。然后选择加密卷的存放位置:点击“选择文件”,找一个文件夹,输入保存文件的文件名,例如“演唱会.avi”。文件名可以是任意合法的文件名,不限定后缀。注意不要选择已有的文件,否则会删除其内容。<img src=“https://tlanyan.me/wp-content...; alt=”" width=“900” height=“579” class=“aligncenter size-full wp-image-3174” />接着选择加密算法和哈希算法。使用默认设置即可,除非你对密码学比较了解。点击下一步,选择加密卷的大小,比如1GB。确定好好加密卷大小后设置加密卷的密码:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“901” height=“582” class=“aligncenter size-full wp-image-3175” />最后选择文件系统格式和簇大小。文件系统建议使用"exFAT"或“NTFS”,簇大小保持默认或“4KB”,然后点击“格式化”。”NTFS“格式化过程中可能会出现授权弹框,点击确定即可:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“905” height=“584” class=“aligncenter size-full wp-image-3177” />格式化后即完成了加密卷的创建过程,此时可以关掉向导。创建好加密卷,要先挂载才能进行读写。回到软件主界面,点击“选择文件”,找到刚才创建的加密卷文件,点击“加载”,在弹出窗口输入创建时设置的密码,点击“确定”:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“883” height=“705” class=“aligncenter size-full wp-image-3178” />VeraCrypt校验密码无误后开始解密文件,解密完成后“我的电脑”中会出现一个新的硬盘,盘符是挂载时选择的盘符。接下来要加密数据,将文件拖入加密盘里即可;将文件从加密盘复制到普通硬盘,就完成了数据的解密。同理可以创建和删除文件,使用上加密卷硬盘和普通硬盘(文件夹)没有区别。使用完后,可以点击软件主界面上的“卸载”将加密盘卸载掉。如果不想再对文件加密,可点击“加密卷工具”中的“永久解密”,将加密文件释放出来。加密非系统分区/设备如果有很多重要的数据放在同一个分区或者硬盘上,可以考虑对整个分区进行加密。创建VeraCrypt加密分区/设备的操作与创建加密卷大致相同,一些步骤上略有出入。由于要加密整个设备或分区,引导时弹出来的是分区和设备信息:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“899” height=“578” class=“aligncenter size-full wp-image-3179” />后续会提示选择加密卷创建模式。如果分区或者设备内数据较少,建议备份后选“创建加密卷并格式化”;如果分区或设备内已有大量数据,建议选择“就地加密分区”:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“901” height=“579” class=“aligncenter size-full wp-image-3180” />最后一步格式化时,如果分区/设备内有数据,会弹出警告确认框。确认数据已备份后,点击“通过在分区内创建VeraCrypt加密卷擦除刚分区上的任何文件”:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“900” height=“585” class=“aligncenter size-full wp-image-3181” />如果分区较大,格式化需要一定时间,完成后会弹出加密设备/分区的使用方法:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“906” height=“586” class=“aligncenter size-full wp-image-3183” />除主界面的“选择文件”改成“选择设备”,使用上与加密卷一致,这里不再重复。隐藏加密卷和隐藏分区/设备因隐藏加密卷和隐藏分区/设备的操作相同,本节以下内容以(隐藏)加密卷做说明。结合上述内容,自己动手实践,读者到这里应该对加密卷有基本的理解。在加密卷基础上,可以进行更高层次的文件保护,那就是选择类型时出现的“隐藏加密卷”。首先澄清一下概念,“隐藏卷”和“卷中卷/嵌套卷”有所不同。嵌套卷是在一个加密卷里再放一个加密文件卷,类似于RAR文件中的RAR文件;隐藏卷是在卷中划分出一片空间给隐藏卷使用,不是简单在里面放加密卷。如果只打开外层加密卷,看不到隐藏卷的内容,也不能知道是否有隐藏卷。这正是隐藏加密卷的厉害之处。除非事先知道有隐藏卷,否则无法判断,VeraCrypt也不知道加密卷内是否有隐藏的内容。因为隐藏卷必然伴随着外层卷,如何操作两者是有讲究的。对含有隐藏卷的加密卷,有三种操作模式:打开加密卷时,只输入外层卷密码。这种模式直接打开外层卷,可对其进行读写。由于VeraCrypt不知道是否有隐藏卷,往加密卷中写内容可能会损坏隐藏卷的数据。如果你知道有隐藏卷,在加载时可以点击“加载选项”,在弹框中勾选“以只读模式加载加密卷”,保护隐藏卷的数据;打开加密卷时,只输入隐藏卷的密码。这种模式直接显示隐藏卷,隐藏卷的操作不影响外层卷;打开加密卷时,先输入外层卷的密码,同时在“加载选项”弹框中勾选“向外层加密卷写入数据时保护隐藏加密卷”,并输入隐藏卷的密码。这种模式打开外层卷,但VeraCrypt知道含有隐藏卷,写数据时不会覆盖隐藏卷占用的空间,数据是安全的。往外层卷写入大量数据,即使外层卷空间不足,VeraCrypt也不会往隐藏卷上写数据,而是直接提示“写入失败”。如果有十分重要的数据需要放在隐藏卷中,外层加密卷应该存放一些“相对”不那么重要的文件,用以蒙蔽胁迫你说出密码的人。但千万要记住,不要说出隐藏卷的密码,否则会直接解锁隐藏卷!加密系统分区/设备如果想更安全的保护设备,可以考虑对系统盘/分区也进行全盘加密。系统盘加密后,系统启动过程中要先输入密码,解密硬盘数据后才能正常启动操作系统。目前MacOS、iOS、安卓等操作系统均支持使用全盘加密,硬盘拆下来也无法在其他设备上读取数据,大大提高安全性。VeraCrypt仅支持对Windows进行系统盘加密,并且不支持2003等旧系统、安腾架构以及移动设备:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“665” height=“247” class=“aligncenter size-large wp-image-3182” />此功能耗时较长。本人未试验,暂不提供详情。实用建议以下是一些实用建议,能帮助你更好的保护隐私数据:实用文件卷加密数据时,文件名和后缀尽量选有欺骗性的,并将其放在常规地方。例如文件卷取名"Window10多合一纯净版.iso",放在“软件/操作系统”文件夹下。对10G以下的加密卷,即使设备丢失后亦不会有人怀疑其中包含敏感数据。相反一个好几G大小的txt或者word文件就会让人很生疑。如果有更私密的数据,建议使用隐藏卷功能;文件加解密有一定的性能损耗,请选择必要的文件放入加密卷/设备内;妥善管理密码,并建议加密时添加辅助解密的密钥文件;如果可以,对新电脑使用全盘加密;将移动设备某个区作为加密分区使用,其他分区为普通分区。总结本人对VeraCrypt进行了简要介绍,并给出Windows上的使用说明。如有错误,敬请指正!感谢阅读!参考TrueCrypt项目主页维基百科:TrueCryptVeraCrypt主页维基百科:VeraCryptVeraCrypt的SourceForge主页VeraCrypt安全审计结果多种流行的固态硬盘产品存在硬盘加密机制绕过漏洞ArchLinux:磁盘加密维基百科:硬盘加密软件比较唐缘:保护你的设备 ...
先前,我们已经介绍过 Mars 是什么。如今 Mars 已在 Github 开源并对内上线试用,本文将介绍 Mars 已实现的分布式执行架构,欢迎大家提出意见。架构Mars 提供了一套分布式执行 Tensor 的库。该库使用 mars.actors 实现的 Actor 模型编写,包含 Scheduler、Worker 和 Web 服务。用户向 Mars Web Service 提交的是由 Tensor 组成的 Graph。Web Service 接收这些图并提交到一台 Scheduler。在提交作业到各个 Worker 之前,Mars Scheduler 先将 Tensor 图编译成一张由 Chunk 和 Operand 组成的图,此后对图进行分析和切分。此后,Scheduler 在所有 Scheduler 中根据一致性哈希创建一系列控制单个 Operand 执行的 OperandActor。Operand 以符合拓扑序的顺序进行调度,当所有 Operand 完成执行,整张图将被标记为已完成,客户端能够从 Web 中拉取结果。整个执行过程如下图所述。作业提交用户端通过 RESTful API 向 Mars 服务提交作业。用户通过编写 Tensor 上的代码,此后通过 session.run(tensor) 将 Tensor 操作转换为 Tensor 构成的 Graph 并提交到 Web API。此后,Web API 将作业提交到 SessionActor 并在集群中创建一个 GraphActor 用于图的分析和管理。用户端则开始查询图的执行状态,直至执行结束。在 GraphActor 中,我们首先根据 chunks 设置将 Tensor 图转换为 Operand 和 Chunk 组成的图,这一过程使得图可以被进一步拆分并能够并行执行。此后,我们在图上进行一系列的分析以获得 Operand 的优先级,同时向起始 Operand 指派 Worker,关于这一部分的细节可以参考 准备执行图 章节。此后,每个 Operand 均建立一个 OperandActor 用于控制该 Operand 的具体执行。当 Operand 处于 READY状态(如同在 Operand 状态 章节描述的那样),Scheduler 将会为 Operand 选择目标 Worker,随后作业被提交 Worker 进行实际的执行。执行控制当一个 Operand 被提交到 Worker,OperandActor 等待 Worker 上的回调。如果 Operand 执行成功,Operand 的后继将被调度。如果 Operand 执行失败,OperandActor 将会尝试数次,如果仍失败则将此次执行标记为失败。取消作业用户端可以使用 RESTful API 取消运行中的作业。取消请求将被写入 Graph 的状态存储中,同时 GraphActor 上的取消接口将被调用。如果作业在准备阶段,它将在检测到停止请求后立即结束,否则请求将被下发到每个 OperandActor,并设置状态为 CANCELLING。如果此时 Operand 没有运行,Operand 状态将被直接置为 CANCELLED。如果 Operand 正在运行,停止请求将被下发到 Worker 中并导致一个 ExecutionInterrupted 错误,该错误将返回给 OperandActor,此时 Operand 的状态将被标记为 CANCELLED。准备执行图当一个 Tensor 图被提交到 Mars Scheduler,一张包含更细粒度的,由 Operand 和 Chunk 构成的图将根据数据源中包含的 chunks 参数被生成。图压缩当完成 Chunk 图的生成后,我们将会通过合并图中相邻的节点来减小图的规模,这一合并也能让我们充分利用 numexpr 这样的加速库来加速计算过程。目前 Mars 仅会合并形成单条链的 Operand。例如,当执行下面的代码import mars.tensor as mta = mt.random.rand(100, chunks=100)b = mt.random.rand(100, chunks=100)c = (a + b).sum()Mars 将会合并 Operand ADD 和 SUM 成为 FUSE 节点。RAND Operand 不会被合并,因为它们并没有和 ADD 及 SUM 组成一条简单的直线。初始 Worker 分配为 Operand 分配 Worker 对于图执行的性能而言至关重要。随机分配初始 Operand 可能导致巨大的网络开销,并有可能导致不同 Worker 间作业分配的不平衡。因为非初始节点的分配能够根据其前驱生成数据的物理分布及各个 Worker 的空闲情况方便地确定,在执行图准备阶段,我们只考虑初始 Operand 的分配问题。初始 Worker 分配需要遵循几个准则。首先,分配给每个 Worker 执行的 Operand 需要尽量保持平衡满,这能够使计算集群在整个执行阶段都有较高的利用率,这在执行的最后阶段显得尤其重要。其次,初始节点分配需要使后续节点执行时的网络”传输尽量小。也就是说,初始点分配需要充分遵循局部性原则。需要注意的是,上述准则在某些情况下会彼此冲突。一个网络传输量最小的分配方案可能会非常偏斜。我们开发了一套启发式算法来获取两个目标的平衡,该算法描述如下:选择列表中的第一个初始节点和第一台机器;从 Operand 图转换出的无向图中自该点开始进行深度优先搜索;如果另一个未被分配的初始节点被访问到,我们将其分配给步骤1中选择的机器;当访问到的 Operand 总数大于平均每个 Worker 接受的 Operand 个数时,停止分配;前往步骤1,如果仍有 Worker 未被分配 Operand,否则结束。调度策略当一个 Operand 组成的 Graph 执行时,合适的执行顺序会减少集群中暂存的数据总量,从而减小数据被 Spill 到磁盘的可能性。合适的 Worker 能够减少执行时网络传输的总量。Operand 选择策略合适的执行顺序能够显著减小集群中暂存的数据总量。下图中展示了 Tree Reduction 的例子,圆形代表 Operand,方形代表 Chunk,红色代表 Operand 正在执行,蓝色代表 Operand 可被执行,绿色代表 Operand 产生的 Chunk 已被存储,灰色代表 Operand 及其相关数据已被释放。假设我们有两台 Worker,并且每个 Operand 的资源使用量均相等,每张图展示的是不同策略下经过5个时间单元的执行后的状态。左图展示的是节点依照层次分别执行,而右图展示的是依照接近深度优先的顺序执行。左图中,有6个 Chunk 的数据需要暂存,右图只有2个。因为我们的目标是减少存储在集群中的数据总数,我们为进入 READY 状态的 Operand 设定了一套优先级策略:深度更大的 Operand 需要被优先执行;被更深的 Operand 依赖的 Operand 需要被优先执行;输出规模更小的节点需要被优先执行。Worker 选择策略当 Scheduler 准备执行图时,初始 Operand 的 Worker 已被确定。我们选择后续 Operand 分配 Worker 的依据是输入数据所在的 Worker。如果某个 Worker 拥有的输入数据大小最大,则该 Worker 将被选择用于执行后续 Operand。如果这样的 Worker 有多个,则各个候选 Worker 的资源状况将起到决定作用。Operand 状态Mars 中的每一个操作符都被一个 OperandActor 单独调度。执行的过程是一个状态转移的过程。在 OperandActor 中,我们为每一个状态的进入过程定义一个状态转移函数。起始 Operand 在初始化时位于 READY 状态,非起始 Operand 在初始化时则位于 UNSCHEDULED 状态。当给定的条件满足,Operand 将转移到另一个状态并执行相应的操作。状态转移的流程可以参考下图:我们在下面描述每个状态的含义及 Mats 在这些状态下执行的操作。UNSCHEDUED:一个 Operand 位于此状态,当它的上游数据没有准备好。READY:一个 Operand 位于此状态,当所有上游输入数据均已准备完毕。在进入这一状态时,OperandActor 向 AssignerActor 中选择的所有 Worker 提交作业。如果某一 Worker 准备运行作业,它将向 Scheduler 发送消息,Scheduler 将向其他 Worker 发送停止运行的消息,此后向该 Worker 发送消息以启动作业执行。RUNNING:一个 Operand 位于此状态,当它的执行已经启动。在进入此状态时,OperandActor 会检查作业是否已经提交。如果尚未提交,OperandActor 将构造一个由 FetchChunk Operand 和当前 Operand 组成的图,并将其提交到 Worker 中。此后,OperandActor 会在 Worker 中注册一个回调来获取作业执行完成的消息。FINISHED:一个 Operand 位于此状态,当作业执行已完成。当 Operand 进入此状态,且 Operand 无后继,一个消息将被发送到 GraphActor 以决定是否整个 Graph 的执行都已结束。与此同时,OperandActor 向它的前驱和后继发送执行完成的消息。如果一个前驱收到此消息,它将检查是否所有的后继都已执行完成。如是,当前 Operand 上的数据可以被释放。如果一个后继收到此消息,它将检查是否所有的前驱已完成。如是,该后继的状态可以转移到 READY。FREED:一个 Operand 位于此状态,当其上所有数据都已被释放。CANCELLED:一个 Operand 位于此状态,当所有重新执行的尝试均告失败。当 Operand 进入此状态,它将把相同状态传递到后继节点。CANCELLING:一个 Operand 位于此状态,当它正在被取消执行。如果此前作业正在执行,一个取消执行的请求会被发送到 Worker 上。CANCELLED:一个 Operand 位于此状态,当执行已被取消并停止运行。如果执行进入这一状态,OperandActor 会尝试将书友的后继都转为 CANCELLING。Worker 中的执行细节一个 Mars Worker 包含多个进程,以减少全局解释器锁(GIL)对执行的影响。具体的执行在独立的进程中完成。为减少不必要的内存拷贝和进程间通讯,Mars Worker 使用共享内存来存储执行结果。当一个作业被提交到 Worker,它将首先被置于队列中等待分配内存。当内存被分配后,其他 Worker 上的数据,或者当前 Worker 上已被 spill 到磁盘的数据将会被重新载入内存中。此时,所有计算需要的数据已经都在内存中,真正的计算过程将启动。当计算完成,Worker 将会把作业放到共享存储空间中。这四种执行状态的转换关系见下图。执行控制Mars Worker 通过 ExecutionActor 控制所有 Operand 在 Worker 中的执行。该 Actor 本身并不参与实际运算或者数据传输,只是向其他 Actor 提交任务。Scheduler 中的 OperandActor 通过 ExecutionActor 上的 enqueue_graph 调用向 Worker 提交作业。Worker 接受 Operand 提交并且将其换存在队列中。当作业可以执行时,ExecutionActor 将会向 Scheduler 发送消息,Scheduler 将确定是否将执行该操作。当 Scheduler 确定在当前 Worker 上执行 Operand,它将调用 start_execution 方法,并通过 add_finish_callback注册一个回调。这一设计允许执行结果被多个位置接收,这对故障恢复有价值。ExecutionActor 使用 mars.promise 模块来同时处理多个 Operand 的执行请求。具体的执行步骤通过 Promise 类的 then 方法相串联。当最终的执行结果被存储,之前注册的回调将被触发。如果在之前的任意执行步骤中发生错误,该错误会被传导到最后 catch 方法注册的处理函数中并得到处理。Operand 的排序所有在 READY 状态的 Operand 都被提交到 Scheduler 选择的 Worker 中。因此,在执行的绝大多数时间里,提交到 Operand 的 Worker 个数通常都高于单个 Worker 能够处理的 Operand 总数。因此,Worker 需要对 Operand 进行排序,此后选择一部分 Worker 来执行。这一排序过程在 TaskQueueActor 中进行,该 Actor 中维护一个优先队列,其中存储 Operand 的相关信息。与此同时,TaskQueueActor 定时运行一个作业分配任务,对处于优先队列头部的 Operand 分配执行资源直至没有多余的资源来运行 Operand,这一分配过程也会在新 Operand 提交或者 Operand 执行完成时触发。内存管理Mars Worker 管理两部分内存。第一部分是每个 Worker 进程私有的内存空间,由每个进程自己持有。第二部分是所有进程共享的内存空间,由 Apache Arrow 中的 plasma_store 持有。为了避免进程内存溢出,我们引入了 Worker 级别的 QuotaActor,用于分配进程内存。当一个 Operand 开始执行前,它将为输入和输出 Chunk 向 QuotaActor 发送批量内存请求。如果剩余的内存空间可以满足请求,该请求会被 QuotaActor 接受。否则,请求将排队等待空闲资源。当相关内存使用被释放,请求的资源会被释放,此时,QuotaActor 能够为其他 Operand 分配资源。共享内存由 plasma_store 管理,通常会占据整个内存的 50%。由于不存在溢出的可能,这部分内存无需经过 QuotaActor 而是直接通过 plasma_store 的相关方法进行分配。当共享内存使用殆尽,Mars Worker 会尝试将一部分不在使用的 Chunk spill 到磁盘中,以腾出空间容纳新的 Chunk。从共享内存 spill 到磁盘的 Chunk 数据可能会被未来的 Operand 重新使用,而从磁盘重新载入共享内存的操作可能会非常耗费 IO 资源,尤其在共享内存已经耗尽,需要 spill 其他 Chunk 到磁盘以容纳载入的 Chunk 时。因此,当数据共享并不需要时,例如该 Chunk 只会被一个 Operand 使用,我们会将 Chunk 直接载入进程私有内存中,而不是共享内存,这可以显著减少作业总执行时间。未来工作Mars 目前正在快速迭代,近期将考虑实现 Worker 级别的 failover 及 shuffle 支持,Scheduler 级别的 failover 也在计划中。本文作者:继盛阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...