门道多:一次MaxCompute PS任务的问题排查之旅




关于PS是什么,可以参考一下以下两个介绍:基于参数服务器的大规模在线学习算法和Parameter Server。更多问题可以咨询玄乐。下面主要总结一下这回遇到一个PS任务跑不起来的问题排查过程。不想看过程的直接看最后一点总结就行。

一 为什么要分享一个问题排查过程   

    作为初级用户来说只要会基于SDK的编程和命令使用就OK了,但对于广告这种重度高级用户来说,如果还把计算框架和MaxCompute当成黑盒来用,任务跑不起来了或者任务出错了就只能两眼一抹黑了,这次分享一来是By Case解了一个很复杂的问题,二来是摸清了里面的门道,简单是一环扣一环,觉得有必要分享一下,给有需要的同学可做下参考。

二 问题的现象

    一个PS任务从提交到最后人工Kill经过了7小时,一直没起起来,而该任务以前是可以正常运行完成的。如下图所示,有两个实例一直处在Ready状态。任务状态

三、排查过程
    首先,在排查之前有必要交待一些基本信息,PS任务主要角色三个:coordinator/server/worker,如下盗图,

这里面有几个关键点先交待下:

1、coordinator占用资源较少,只会起一个Instance,占用资源基本是1Core + 1G;

2、Server和Worker占用资源较多,根据特征量和样本大小的不同其实例个数也有较大差别,目前大的能到3000个实例(如本Case),每个实例需要10Core + 5~20G;

3、aon:即all-or-nothing,介绍,必须(三个Task)所有的实例都分配到了资源才会开始进行迭代计算;aon模式是采用机器打标预留资源的方式给任务分配资源,会以占满整机的方式分配,照例来个示例:一个任务有120个实例,每个实例要8core,单机是31Core,那么一台机器上就能放3个实例占24Core,剩下7Core则分给其他任务,该任务一共要占120/3=40台机器。

4、中间如果某个实例失败了,整个计算都会暂停,直到所有实例拿够资源才会恢复运行;

5、如下出现数字中如果没有单位,则CPU单位为1核=100个基本单位、内存单位为MB;

【第一轮】:目标直指资源不够。

任务所在的AY87B集群资源:按s10机型(32Core + 128G,实际可用31Core + 110G)推算应该是3600+的机器数,目前分给了两个quota组,alimm_mpi_kgb:2000台,alimm_mpi_k2:1100台(感觉绰绰有余的样子);

该Job被Kill时的基本信息:(为了简化,略去mem信息,因为本Case 内存不是瓶颈)

Task类型

实例数(Total/Ready/Running)

单实例Cpu需求

汇总CPU

coordinator

1/1/0

100

100

Server

3000/2/2998

1500

4500000

Worker

3000/0/3000

1500

4500000

所有汇总

 

 

9000100

PS是在aon模式下工作的(这个判断后面被证实是不完全对的,汗),单机能分配的worker是2个(15 * 2=30core,31core能容下两个),Server单机也是能起2个,这样算下来基本需要3000台机器;

咦,但Job所在的quota组(alimm_mpi_kgb)只分配到了2000台,按理说应该有1000台的缺口会导致有2000个实例处在Ready状态,同时算出来的资源需求是9000100,而神农监控里面发现实际资源需求(request项)只有5400100,如下图

问题出在哪?

         【第二轮】:PS内部有玄机

         找到玄乐细细了解了一下,得到两个很重要的线索,PS内部有一些默认约束:

  • 由于某种原因,Worker的资源申请量会打7折,Server会打5折;
  • 单台机器上只能启动1个Server和2个Worker;如下是发给Fuxi的json串

 "PSServerTask": {
                "MaxAssignCountEachMachine": 1,

 "Resource": {
                    "CPU": 750,// server打了5折
                    "Memory": 5000} // mem不打折

}

"PSWorkerTask": {

                "MaxAssignCountEachMachine": 2,

 "Resource": {
                    "CPU": 1050, //worker打了7折
                    "Memory": 5000}// mem不打折

}

  • PS内部没有使用all-or-nothing,只是他的行为符合aon特征;

这样一来,上述表格需要调整一下

Task类型

实例数(Total/Ready/Running)

单实例Cpu需求

汇总CPU

coordinator

1/1/0

100

100

Server

3000/2/2998

1500*0.5

2250000

Worker

3000/0/3000

1500*0.7

3150000

所有汇总

 

 

5400100

这回资源对上了,单机起2个worker需要1500台机器(能同时起1500个Server),起3000 个server还需要1500台,缺口只有2个Server(2台),但集群明明逻辑上有3600+,为什么持续7个小时分配不到,而集群的整体利用率也不是很高,如下图:

【第三轮】这时你必须知道的物理部署情况

         由于一直负责广告的MaxCompute接口,所以马上想到了ay87b集群物理上机器型号有差异,是s10(32core + 128G)和n41(64core + 192G,实际可用63core + 170g)混布的,物理上大概有3040台,这个数字和3000好接近呀,但还是大于3000呀,同时这个时候发现了另外一个现象:虽然最终发现有2个Ready的Server,但实际这7个小时经历了三段:18~20点缺口有53台;20~22点资源是够的;22点到被Kill资源最终差2台;

【第四轮】机器有加黑、资源有碎片

是不是有什么情况导致机器可用数低于3000呀,现在一切应该朝着可用数2998去追踪了。

18~20点:从资源缺口和实际的server实例的start_time算出有53台【(request-used)/(1500 * 0.5)】的机器缺口,基本确定有两个因素:一是华佗加黑了几台机器,二是当时另外一个quota组(alimm_mpi_k2)启动的任务了多个aon类型的xlibmpi任务,有90台左右的机器上剩余资源小于750,导致资源碎片化,如下图中的蓝色部分,正好是8点有个资源使用的下降,说明有个任务跑完了释放出来了部分机器。

最终也找出了这个Xlibmpi任务,其配置如下:

"Resource":{"CPU":1200,"Memory":50000},
    "managedInstanceNum":240,

如按s10机型来看,基本就是占了120台机器,每台机器还剩下700(7Core),刚刚不够这人PS任务的Server用(需要750)。如果按N41机型来看,单机还能剩下6300-2400=3900,所以是够起Server的,这里基本可以判断出该xlibmpi任务占了约90台s10,30来台n41。 

20~22点:这期间资源是够的,按理说任务应该能跑起来了,但用户反馈没有看到任务有过运行过的日志记录, 2小时肯定够任务跑好多轮了。 

22~01(被Kill):这期间大批量机器被加黑,如下图所示,通过后台日志分析发现共有32台被加黑了。同时上图alimm_mpi_k2在22点左右的空降也说明那个时间机器加黑数较大,同时影响了两个quota组,而alimm_mpi_kgb只被影响了几台,这个时候总的物理上可用机器数应该就定格在2998台了,直到被kill也没有拿够。

【第五轮】coordinator也failover了

         对于20~22点任务没执行这个问题实际上是个误判,因此通过玄乐提供的诊断任务工具(Here)发现coordinator在21:59:16发生过failover,如下图

,发生failover时之前的日志就被清空了,所以实际上该Job是运行过2小时左右的。这下整个问题基本也就梳理清楚了。

四 总结的几个收获点

  • PS没有设置isAllOrNothing; Ps行为上是aon,但在资源分配上实际没有使用aon;
  • 单机默认有2Worker 和1Server限制;
  • Worker的CPU会打7折,Server的CPU会打5折,而Mem则不打折。至于原因嘛还是因为Fuxi底层在CPU限制上面没有太死,而Mem上则使用过了就会被Kill。
  • 规划任务和资源时一定要留点Buffer;
  • 分布式系统下物理部署有时候很难对用户透明;
  • PS内部会对coordinator/server/worker做failover;
  • PS默认10轮做一次checkpoint;
  • 查看任务jobstatus和任务在控制集群上的行为可以参考两个工具:detect和 SLS
  • 机器加黑时有发生,而且有时候量还会比较大,如果几十台;可以通过神农监控查看;

五、存在的问题

1、会发现像这回这种大任务资源需求大,设置好plan mem/cpu实际上较难,受物理部署/单机网卡/单机内存和cpu/是否统一机型等多种因素影响,需要测试出一些经验值;

2、Logview里面coordinator failover之后看不到之前的stderr了

3、之前想做的aon/mpi类任务按团队隔离还是会面临物理上相互影响的情况,面临多因素难平衡的问题,一方面希望worker/server 尽量分散(要求机器多),另一方面又需要aon任务不要花时间去攒资源(资源要充足),但同时集群利用率又要保障,现在也在探索一些解决方案,希望大家也多多提提想法。总之,优化这条路还长着呢



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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Volley简单学习使用五—— 源代码分析三

一、Volley工作流程图: 二、Network在NetworkDispatcher中须要处理的网络请求。由以下进行处理:NetworkResponse networkResponse mNetwork.performRequest(request);看一下mNetwork的定义:(定义在NetworkDispatcher中&#xff0…

html5 - history 历史管理

参考文章: w3c : http://www.w3.org/html/ig/zh/wiki/HTML5/history 张鑫旭 : http://www.zhangxinxu.com/wordpress/2013/06/html5-history-api-pushstate-replacestate-ajax/ zawa : http://zawa.iteye.com/blog/1271031  Demo : Demo 截图&#xff…

Android开发学习---使用Intelij idea 13.1 进行android 开发

Android开发学习---使用Intelij idea 13.1 进行android 开发 原文:Android开发学习---使用Intelij idea 13.1 进行android 开发1.为什么放弃eclipse?太卡!! 实在受不了eclipse的卡了,运行WEB项目还好,但android开发实在太慢,太慢!经常卡死,CPU经常被占满! 看网上很多人都说比I…

Logcat打印调试信息

Android Logcat调试中的V、D、I、W、E的分别代表什么? Log.v -- 黑色 -- verbose infoLog.d -- 蓝色 -- debug infoLog.i -- 绿色 -- infoLog.w -- 橙色 -- warnLog.e -- 红色 -- error info//Log.ASSERT -- 断言 //Log.wtf() (1、Log.v 的调试颜色为黑色的&#xf…

C# .net core 使用自定义的WebProxy

为什么80%的码农都做不了架构师?>>> 因为.net core 的System.Net 中没有提供WebProxy这个方法,所以可以根据需求实现一个. public class CoreWebProxy : IWebProxy{public readonly Uri Uri;private readonly bool bypass;public CoreWebProxy(Uri uri,…

2015年08月

2015年07月 - 2015年09月 ● 一般而言。。。 一般而言,牙周病轻者有口臭、牙龈红肿疼痛、刷牙流血等症状,严重时会造成牙龈萎缩、牙齿敏感、牙齿摇动等情况。口腔没有在饮食后30分钟清洁就会逐渐转化为酸性环境(PH值约5.5)&#x…

scala case class 继承_数字硬件系统设计之一:Scala快速入门(2)

原想简单笼统介绍一下scala,后感觉这么做意思不大,网友看了和没看一样,还是应该稍微详细具体一点,故而把系列编号由(上)(中)(下),改为(上)(2)(3)(4)(5)....,(上)就是(1)吧,以下内容部分节选于我们即将出版的…

crontab命令

前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另外, 由于使用者自己也可以设置计划…

求圆和椭圆上任意角度的点的坐标

圆上任意角度的点的坐标 如上图,给定圆心(Cx,Cy),半径为R, 求θ\thetaθ对应的点的坐标? 此处θ\thetaθ是相对于水平轴的角度。 显然我们可以使用极坐标转换来求: {pxCxRcos(θ)pyCyRsin(θ)\left\{\begi…

smtp中mailfrom是必须的吗_你是住在高层建筑中吗?这是你必须了解的

01PARTONE消防电梯和普通客梯的作用及特点1.消防电梯是在建筑物发生火灾时供消防人员进行灭火与救援使用且具有一定功能的电梯。因此,消防电梯具有较高的防火要求,其防火设计十分重要。2.普通电梯均不具备消防功能,发生火灾时禁止人们搭乘电梯…

c++ 函数的值传递,引用传递 和 引用返回的探索

2019独角兽企业重金招聘Python工程师标准>>> 前言 C的函数参数和返回分为按值传递和按引用传递,应用到类上面,会涉及到类的 赋值操作 复制函数 构造函数 析构函数 虽然java开发了两年,但对我而言c我还只是一个初学者.c还有很多陌生的特性需要自己亲自探索.这里用实际…

GCD的部分总结

GCD是基于C语言的底层API,用Block定义任务用起来非常灵活便捷. GCD的基本思想是就将操作放在队列中去执行 (1)操作使用Blocks定义(2)队列负责调度任务执行所在的线程以及具体的执行时间(3)队列的特点是先进先出(FIFO)的,新添加至对列的操作都会排在队尾关于多线程的…

多线程编程2-NSOperation

本文目录 前言一、NSInvocationOperation二、NSBlockOperation三、NSOperation的其他用法四、自定义NSOperation回到顶部前言 1.上一讲简单介绍了NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步…

闪回表操作语法+使用闪回删除

闪回表操作语法 flashback table 【 schema.】 table_name to {【before drop 【rename to new_table_name】 】|【scn | timestamp 】】 expr 【enable | disable 】 triggers}: 参数说明: schema:用户模式 before drop:表示恢复到删除…

欧拉函数 - HDU1286

欧拉函数的作用: 有[1,2.....n]这样一个集合,f(n)这个集合中与n互质的元素的个数。欧拉函数描述了一些列与这个f(n)有关的一些性质,如下: 1、令p为一个素数,n p ^ k,则 f(n) p ^ k - p ^ (k-1) 2、令m&…

其中一个页签慢_渭南提升一个大专学历的有效方法

渭南提升一个大专学历的有效方法,宏德教育,目前已形成以高等学历教育为特色王牌,职称考评、企业内训为辅助的强力优势品牌。渭南提升一个大专学历的有效方法, 获得发明专利或实用新型专利,且已实施取得效益。出版本专业…

《收集苹果》 动态规划入门

问题描写叙述 平面上有N*M个格子,每一个格子中放着一定数量的苹果。你从左上角的格子開始,每一步仅仅能向下走或是向右走,每次走到一个格子上就把格子里的苹果收集起来,这样下去,你最多能收集到多少个苹果。 输入&…

Xamarin XAML语言教程通过ProgressTo方法对进度条设置

2019独角兽企业重金招聘Python工程师标准>>> Xamarin XAML语言教程通过ProgressTo方法对进度条设置 在ProgressBar中定义了一个ProgressTo方法,此方法也可以用来对进度条当前的进行进行设置,ProgressTo与Progress属性的不同之处在于ProgressT…

h5新特性

 CSDN博客 Gane_ChengHTML5新特性浅谈 发表于2016/10/17 21:25:58 7809人阅读 分类: 前端 转载请注明出处: http://blog.csdn.net/gane_cheng/article/details/52819118 http://www.ganecheng.tech/blog/52819118.html (浏览效果更好…

mysql日期截取年月_摄影大赛丨“我遇见最美的光”第五届全国医务人员摄影大展 截稿日期2020年8月15日...

截稿日期2020年8月15日《“我遇见最美的光”第五届全国医务人员摄影大展》欣赏过山川壮丽,瞻仰过造化旖旎,敬重于生命伟大,感动于英雄凯旋……由《大众摄影》主办,正大天晴药业集团股份有限公司、《中国卫生影像》杂志协办的“我遇…