首页 文章 精选 留言 我的

精选列表

搜索[提高],共10000篇文章
优秀的个人博客,低调大师

JavaScript 工作原理之十二-网络层探秘及如何提高其性能和安全性

本系列持续更新中,Github 地址请查阅这里。 这是 JavaScript 工作原理的第十二章。 正如在之前关于渲染引擎的文章中所讲的那样,我们相信好的和伟大的 JavaScript 开发者之间的差别在于后者不仅仅只是理解了语言的具体细节还了解其内部构造和运行环境。 网络简史 49 年前,ARPAnet 诞生了。它是早期的报文分组交换网络及第一个实现 TCP/IP 协议套件的网络。该网络连通了加利福亚大堂和斯坦福研究所。20 年后,Tim Berners-Lee 分发了一个后来为人所熟知的万维网的 『Mesh』草案。在 49 年的时间里,网络走过了一段漫长的旅程,从仅仅只是是两台电脑间交换数据报文到至少 7500 万台服务器,38 亿人使用互联网以及 13 亿个网站。 本文将试着分析现代浏览器使用哪些技术来自动提升应用性能(有些你甚至不了解),然后着重介绍浏览器网络层。最后,提供一些让浏览器提升网络应用程序性能的技巧。 概述 现代浏览器专门为快速,高效和安全数据传输的网络应用/网站而设计开发的。拥有数以百计的组件运行于各个不同的层级,从进程管理和安全沙箱到 GPU 管线,音频和视频及其它更多等等,网络浏览器更类似于一个操作系统而不仅仅只是一个软件。 浏览器的整体性能是由一些大型的组件所决定的,这些组件包括:解析,布局,样式计算,JavaScript 和 WebAssembly执行,渲染,当然还有网络堆栈。 一般情况下,工程师们会把网络堆栈看成是一个性能瓶颈。经常会发生这样的情况因为从网络抓取所有的资源会堵塞渲染剩下的步骤。为了更加高效的网络层,它需要不仅仅只是扮演套接字管理员的角色。在我们看来获取资源是一个非常简单的机制,但是实际上它集成自身的优化准则,接口和服务的一整套平台。 网页开发者不需要担心单独的 TCP 或者 UDP 数据包,请求格式化,缓存以及其它正在发生的一切。浏览器会处理这些复杂的玩意,这样就可以专注开发自己的程序。但是,知道其内部的原理可以帮助开发者开发出更加高效和安全的程序。 本质上,当用户开始和浏览器发生交互所产生的情况如下: 用户在浏览器地址栏中输入 URL 地址。 在网络上查找指定 URL 的资源,浏览器开始检查本地和应用程序缓存并试着使用本地副本来响应资源的请求。 当缓存不可用,浏览器使用 URL 中的域名然后根据域名从 DNS 处获取服务器的 IP 地址。如果有域名缓存,将不需要进行 DNS 查询。 浏览器创建一个 HTTP 报文表明其请求远程服务器的某个网页。 报文被传输到 TCP 层,该层会在 HTTP 报文头部添加其自身的信息。该信息是保持创建的会话的必要信息。 然后在 IP 层处理报文,该层的主要职责即找出从用户发送报文到远程服务器的路径。在 HTTP 报文头部添加该路径信息。 传输报文到远程服务器。 一旦接收到报文,以类似的方式返回响应数据。 W3C Navigation Timing specification 提供了浏览器接口及浏览器中每个请求背后的可视化计时和性能数据。让我们浏览下这些组件,因为每个组件在获取最佳用户体验方面扮演了重要的角色。 整个网络请求过程是相当复杂的并且有许多的层次结构,每一层都有可能成为性能瓶颈。这就是为什么浏览器使用各种技术努力提升其性能,以便把整个网络通信的性能损耗降至最低。 套接字管理 看些新技术吧: 源-由应用程序协议,域名和端口号的三个部分组成(比如 https, www.example.com, 443) 套接字池-属于同源的一组套接字(所有的主流浏览器都限制套接字池最多只能有 6 个套接字) JavaScript 和 WebAssembly 禁止开发者操作单独的网络套接字的生命周期,这样是相当的明智的。这样不仅仅可以让你头发少掉点而且可以让浏览器自动优化大量的性能,这些性能包括套接字重用,请求优化和延迟绑定,协议协商,强制连接限制及其它的优化措施。 实际上,现代浏览器更一步地将请求管理周期从套接字管理中剥离了出来。用套接字池来组织套接字,以源来分组套接字,每个套接字池强制限制其连接数和安全约束。排队,优先化等待的请求,然后和套接字池中的单个套接字绑定。如果不是服务器主动关闭这些连接,多个请求可以自动重用相同的套接字。 由于创建一个新的 TCP 连接会带来额外的性能开销,重用连接会为其自带来极大的性能提升。默认情况下,当发起请求的时候,浏览器使用所谓的 『keepalive』机制以节省创建到服务器的新连接所耗费的时间。创建一个新的 TCP 连接的平均时间为: 本地请求-23 毫秒 Transcontinental 请求-120 毫秒 Intercontinental 请求-225 毫秒 这样的架构衍生出了一些其它的优化方法。请求可以依据优先级来以不同的顺序执行。浏览器可以优化所有套接字间的带宽分配或者它可以创建套接字以等待预期的请求。 如上所述,这些都是浏览器所控制而不用开发者进行干预。但这并不意味着我们无所事事了。选择正确的数据传输所用的网络通信模式,类型和频率,正确的协议类型以及正确的服务器堆栈隧道/优化对于提升整个程序的性能有着至关重要的作用。 一些浏览器甚至更进一步。例如,当你使用 Chrome 的时候,当用户使用的时候它会进行自我学习从而变得更加快速。它基于访问过的网页和典型的浏览器模式来进行学习,这样就可以预期可能的用户行为且在用户进行任意操作之前进行操作。最简单的例子即当用户悬停在某个链接上的时候预渲染页面。如果你想学习更多关于 Chrome 优化技术的文章,可以查看 High-Performance Browser Networking 这本书的 www.igvita.com/posa/high-p… 章节。 网络安全和沙箱 允许浏览器操作单独的套接字有另一个非常重要的目的即:浏览器就可以针对不被信任的程序资源强制实施一套一致的安全和政策约束措施。例如,浏览器禁止通过 API 直接访问原始网络套接字,因为这样会导致任意可疑的程序随意连接任意主机。浏览器也强制连接数限制以保护服务器免受由于客户端访问而耗尽其资源。 浏览器格式化所有流出的请求以强制格式正确和一致的协议语义来保护服务器。同样地,浏览器会自动解码响应内容以保护用户免受可疑服务器的攻击。 TSL 协商 Transport Layer Security (TLS) 是一个为计算机网络提供通信安全的加密协议。它广泛应用于大量应用程序,其中之一即浏览网页。网站可以使用 TLS 来保证服务器和网页浏览器之间的所有通信安全。 整个 TLS 握手过程包含以下几个步骤: 客户端向服务器发送 『Client hello』 信息,附带着客户端随机值和支持的密码组合。 服务器返回给客户端 『Server hello』信息,附带着服务器随机值。 服务器返回给客户端认证证书及或许要求客户端返回一个类似的证书。服务器返回『Server hello done』信息。 如果服务器要求客户端发送一个证书,客户端进行发送。 客户端创建一个随机的 Pre-Master 密钥然后使用服务器证书中的公钥来进行加密,向服务器发送加密过的 Pre-Master 密钥。 服务器收到 Pre-Master 密钥。服务器和客户端各自生成基于 Pre-Master 密钥的主密钥和会话密钥。 客户端给服务器发送一个 『Change cipher spec』的通知,表明客户端将会开始使用新的会话密钥来哈希和加密消息。客户端也发送了一个 『Client finished』的消息。 服务器接收到『Change cipher spec』的通知然后使用会话钥匙来切换其记录层安全状态为对称加密状态。服务器返回客户端一个 『Server finished』消息。 客户端和服务器现在可以通过建立的安全通道来交换程序数据。所有客户端和服务器之间发送的信息都会使用会话密钥进行加密。 每当发生任何验证失败的时候,用户会收到警告。比如服务器使用自签名的证书。 同源策略 当两个页面的协议,端口(如果有指定)以及主机名都是一样的则称为同源。 以下为一些可能包含跨域的资源示例: <script src=”…”></script> 里面的 JavaScript 代码。语法错误的错误信息仅适用于同源脚本。 <link rel=”stylesheet” href=”…”> 的 CSS。由于 CSS 的松散语法规则,跨域 CSS 要求正确的 Content-Type 头。各个浏览器的限制不同。 <img> 图片 <video> 和 <audio> 媒体文件 <object>,<embed>和<applet> 插件 @font-face 字体。一些浏览器允许跨域字体,其它则要求同源字体。 和 相关的一切内容。网站可以使用 X-Frame-Options头来防止此种跨域交互。 以上的列表还远远不够;该列表旨在强调工作中的『最小特权』原则。浏览器只为应用程序代码暴露出其所必需的接口和资源:应用提供数据和 URL 地址,然后浏览器格式化请求及处理每条连接的整个生命周期。 需要注意的是并没有一个简单的 『同源策略』概念。 相反,有一系列相关的机制来强制限制浏览器的 DOM 访问,cookie 和 会话状态管理,网络连接和其它组件。 资源和客户端状态缓存 最好和最快的请求即不创建请求。在分派一个请求前,浏览器自动检查其资源缓存,进行必要的验证检查然后当指匹配指定的条件时返回一份本地资源拷贝。如果缓存中没有可用的本地资源,则发起网络请求然后把响应内容自动放置于缓存中以备之后的访问(如果这是被允许的)。 浏览器自动为每个资源求值缓存指令。 当条件允许时,浏览器自动重新恢复过期资源 浏览器自动处理缓存和资源回收的大小 管理一个高效和优化的资源缓存是非常困难的。谢天谢地,浏览器为我们处理了整个复杂的玩意,而我们所需要做的即保证服务器返回恰当的缓存指令;想了解更多可以看 客户端资源缓存 文章。你为网页上的所有资源添加 Cache-Control,ETag,和 Last-Modified 的响应头信息。 最后,一个经常被忽略但至关重要的浏览器功能即其提供了验证,会话和 cookie 管理。浏览器为每个源维护单独的『cookie jars』,通过提供必要的程序和服务器接口来读写新的 cookie,会话和认证数据,以及自动挂载和处理适当的 HTTP 头来为我们自动处理整个过程。 例子: 一个简单但明了的用来展示浏览器的延迟会话状态管理的方便性的例子即:多个选项卡或者浏览器窗口可以共享一个认证会话,反之亦然;一个选项卡中的登出操作可以使所有其它打开窗口的会话失效。 应用程序接口和协议 了解了网络服务之后,最终要讲到应用程序接口和协议。众所周知,更底层的结构提供了一组广泛的重要服务:套接字和连接管理,请求和响应处理,各种安全策略,缓存及其它更多的强制措施。每当初始化一个 HTTP 请求或者 XMLHttpRequest,一个持久的服务推事件或者 WebSocket 会话抑或打开一个 WebRTC 连接,我们就是在和部分或者所有这些底层服务进行交互。 没有单一的最佳协议或者接口。每个复杂的程序都会基于不同的要求混合使用不同的传输协议:和浏览器缓存的交互,协议开销,消息延迟,可靠性,数据传输类型以及其它。一些协议拥有低数据传输延迟的特性(比如服务器推事件,WebSocket),但是可能不符合其它重要的场合,比如利用浏览器缓存或者支持任意情况下的二进制数据传输的能力。 一些可以用来提升程序性能和安全的小技巧 一直在请求中使用 『Connection: Keep-Alive』头信息。浏览器默认在请求头中添加 『Connection: Keep-Alive』。保证服务器也使用同样的机制。 使用合适的 Cache-Control,Etag 和 Last-Modified 头信息以便节省浏览器的下载时间。 花些时间调整和优化服务器。这是奥秘所在!注意这一过程是否针对每个程序和所传输的数据。 一直使用 TLS!特别是如果程序中包含有任意类型的认证。 研究浏览器所提供的安全策略并且在程序中强制实施。 扩展 关于字体文件的跨域问题可以查看这里和这里。 打个广告 ^.^ 今日头条招人啦!发送简历到 likun.liyuk@bytedance.com ,即可走快速内推通道,长期有效!国际化PGC部门的JD如下:c.xiumi.us/board/v5/2H…,也可内推其他部门! 本系列持续更新中,Github 地址请查阅这里。 原文发布时间为:2018年06月25日 原文作者:tristan 本文来源: 掘金 如需转载请联系原作者

优秀的个人博客,低调大师

Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类

正文 一、前提 目的:动态加载SD卡中Apk的类。 注意:被加载的APK是未安装的。 相关:本文是本博另外一篇文章:Android动态加载jar/dex的升级版。 截图: 成功截图: 二、准备 准备被调用Android工程:TestB ITest public interfaceITest{ StringgetMoney(); } TestBActivity public classTestBActivity extendsActivity implementsITest{ /** Calledwhentheactivityisfirstcreated. */ @Override public voidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override publicStringgetMoney(){ return"1"; } } 代码说明:很简单的代码。将生成后的TestB.apk拷贝到SD卡的根目录下。 三、调用 调用工程TestA public classTestAActivity extendsActivity{ /** Calledwhentheactivityisfirstcreated. */ @Override public voidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Stringpath=Environment.getExternalStorageDirectory()+"/"; Stringfilename="TestB.apk"; DexClassLoaderclassLoader= newDexClassLoader(path+filename,path, null,getClassLoader()); try{ ClassmLoadClass=classLoader.loadClass("com.nmbb.TestBActivity"); Constructorconstructor=mLoadClass.getConstructor( newClass[]{}); ObjectTestBActivity=constructor.newInstance( newObject[]{}); MethodgetMoney=mLoadClass.getMethod("getMoney", null); getMoney.setAccessible( true); Objectmoney=getMoney.invoke(TestBActivity, null); Toast.makeText( this,money.toString(),Toast.LENGTH_LONG).show(); } catch(ClassNotFoundExceptione){ e.printStackTrace(); } catch(SecurityExceptione){ e.printStackTrace(); } catch(NoSuchMethodExceptione){ e.printStackTrace(); } catch(IllegalArgumentExceptione){ e.printStackTrace(); } catch(InstantiationExceptione){ e.printStackTrace(); } catch(IllegalAccessExceptione){ e.printStackTrace(); } catch(InvocationTargetExceptione){ e.printStackTrace(); } } } 执行的时候可以发现会自动生成TestB.dex文件。动态加载方面还可以搜索一下"Java动态加载"方面的资料,很有参考价值。可以发现比Android动态加载jar/dex使用起来方便得多。 四、下载 TestA.zip TestB.zip 五、注意 6.1 别忘了加上SDCARD的写权限: android.permission.WRITE_EXTERNAL_STORAGE 6.2 同样注意,不要再两个工程包含package和名称相同的接口,否则报错。(参见Android动态加载jar/dex的后期维护) 六、扩展阅读 探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法 (强烈推荐:QQ游戏动态调用Activity的方法:通过ClassLoader,loadClass Activity类,然后分别在主工程的onDestroy、onKeyDown、onPause、onRestart、onResume等生命周期方法中反射调用(Method、invoke)子工程的类方法来模拟实现整个生命周期。此外巧妙的通过解压缩APK文件来获取游戏的资源) Android中文Wiki:DexFile 七、缺点 6.1 由于是使用反射,无法取得Context,也就是TestBActivity与普通的类毫无区别,没有生命周期。 八、推荐 Android版 程序员专用搜索 结束 忙着换工作、忙着把翻译组转动Wiki平台、忙着推广翻译组...忙这忙那的,博客已经有近2个月没有写Android方面的文章,终于又可以回来,继续挤时间来写博客,与大家一同探讨与分享。 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/844928,如需转载请自行联系原作者

优秀的个人博客,低调大师

在Android设备上提高工作效率和安全性的10招

或许阁下刚刚买入第一款安卓设备,或许阁下使用安卓设备已经有一段时间了但却觉得可能没有最有效地利用它。无论是那种情况,阁下今天行好运了:利用各种调整、应用程序、选项和配置等方法可以使得安卓设备更加强大和有效。下面列出10个笔者最喜欢的技巧,以期帮助阁下在安卓平台上获得最大的好处。 1.使用谷歌 关于安卓的第一件要知道的事是,安卓是与谷歌紧密地整合在一起的。如果不利用二者之间这种整合的优势,就白白错过好东西。笔者说的不仅仅是谷歌网盘、日历、邮件、照片等等,还有搜索。“谷歌Now”时下是安卓里与之最紧密整合的工具之一。如果对其没有最佳地加以利用,阁下就可能真是在对安卓行瞎子摸象之道了。设好谷歌Now的热词(可以吼一声“Okay Google”?),接着就可以体会强大的安卓数字助理所拥有的各种细节了。 2.设置自动备份 安卓设备一般都是和谷歌帐户关联在一起的。用安卓设备可以收电邮、处理谷歌文档。而设备上的所有信息待在那……等的是丢了设备的那一天,或者不小心设备掉马路上了,正好一辆车飙过,设备被碾成碎片,随之而来的是钻心的痛苦。没错,没有买保险的话,阁下大不了花大钱再买一款。但是,那上面的数据可是打水漂了。如果想避免这样的悲剧,就一定要进入设备的备份和重置功能里设置备份。安卓可以备份应用程序数据、Wi-Fi密码、其他谷歌服务器的设置、照片、联系人等。 3.安装Tasker程序 如果一定要选一款彻底改变安卓体验的程序,那这款程序就是Tasker。Tasker程序可以将设备最大限度地设成自动模式。Tasker可以基于时间、地点、事件设置自动执行对应的任务。笔者不是那种常常说“在安卓平台里再也找不到比这更强大的好工具”的人,然而,这样的工具还真的就在眼下。Tasker不是免费的,但相对于2.99美元的入门价格,该应用程序为阁下的设备提供的东西是大大地物有所值。不信可以看看26000多个用户的5星级评价。Tasker确实是款5星的软件。 4.安装第三方主屏启动程序 别误会:原始(Stock)安卓自带的主屏启动程序也不错。问题是,很少几款设备用的是真正意义上的原始安卓自带的主屏启动。如果阁下不喜欢现在的主屏互动,那就安装笔者最喜欢的Nova Launcher吧。Nova提供的外观、感觉和功能组合堪称完美。Nova提供手势支持和清净的界面,各方面都好用。但如果Nova不是您的菜,坊间还有很多其他的主屏幕启动程序,总有一款会合阁下的口味的。 5.升级 如果您运行的是过时的安卓版本,请务必定期检查升级。目前,安卓的最新版本是5.1。该版本和老版本比起来简直是天壤之别。随着一次又一次的更新,安卓也越来越好。但唯一的缺陷是,有些设备是不能升级到最新版本的。如果您的安卓智能手机或平板电脑用的是过时版本,而且合同也快结束了,那就到了升级手机的时候了。如果您想最大限度地利用安卓,就要持续最新。 6.安装文件管理器 有时候您需要找一个本地文件(例如下载的文件)。这时候最好的办法就是利用文件管理器。有些设备(如老一点的三星设备)里含一个名为“我的文件”(My Files)的应用程序。“我的文件”尽管凑合能用,但功能远不如诸如Astro File Manager的文件管理器。现代移动文件管理器还涵括大量花里胡哨的东西(如SMB或蓝牙插件),但大多数情况下,用户只需在安卓目录结构里找一个文件而已。这时,如果设备安装了一个文件管理器就会省不少心。 7.设置锁屏密码保护 设置锁屏密码保护虽然不会增加功能或使得设备更强大,但这样做可以保护您的数据。设好了密码、PIN或图案锁定屏幕,可以增加有心人窥看您的数据的难度。没说的。无可争辩。没错,这样做会造成不方便。没错,现在又多了一步才能上Facebook或自拍。但是,阁下的数据最终会诚心感谢阁下。再说一遍:无可争辩。如果在家里或是在工作场所老是要输入密码太烦了,可以设置可信任地点(前提是设备是运行Lollipop的)。如此,当您处于可信任地点500英尺的范围内就无需输入密码/PIN/图案。 8.设置二次验证 接上一个话题……还是安全。皆因移动数据有不少弱点。但我们也无需在设备遗失时交出密钥俯首称臣。有密码保护的主屏有助于防止别人访问您的设备。再多走一步就可以防止别人访问令设备更强大的平台账号:谷歌。如果设置了二次验证,要进入您的谷歌帐户的唯一方法是,使用您的帐号密码和一个由谷歌身份验证器应用程序随机生成的四位数代码 。即刻设置二次验证。现在就设。 9.利用新的Gmail 如果您已经升级成Lollipop了,那就最好习惯一下Gmail应用程序,因为谷歌已经搁置原始Gmail电子邮件工具。不过没关系。Gmail的发展历史已经够长够成熟的了,给它什么东西(甚至Exchange)都能够处理。最妙的是,Gmail并没有想成为接管所有电邮的通用电子邮箱。用户现在反而只需(从屏幕左面开始)右扫屏幕就可以轻松地调出侧边栏在账户之间切换。点选在侧边栏顶部的帐户图像就可以在帐户之间进行切换。 10.切换到谷歌Hangouts 现代人花很多时间来来回回发信息。在安卓上,信息可以是手机短信、谷歌Hangouts或别的形式。要想轻松一点,就安装Hangouts应用吧,Hangouts可以将各种短信和谷歌Hangouts整合到一个优秀的工具里。Hangouts不单是一种可以在一个地方接受不同聊天形式的方法,它实际上比默认短信应用程序更优秀一些。至于谷歌为什么还没有踢走标准消息应用程序,我大概永远也搞不清楚。 原文发布时间为:2015-7-14 本文作者:孙博 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网

优秀的个人博客,低调大师

Java架构师与开发者提高效率的10个工具

Java受到全球百万计开发者的追捧,已经演变为一门出色的编程语言。最终,这门语言随着技术的变化,不断的被改善以迎合变化的市场需求。 无论你是否拥有一家科技公司,软件已经成为几乎每一个企业不可或缺的一部分,为了吸引你潜在的顾客,你应该交付给客户一个技术上有创新的产品。那么,Java能提供这样的平台帮你实现这一技术创新。Java贡献者们一直保持着大幅度的更新,以提供最新最强大的功能。 最近发布的Java8完美的诠释了高效和创新的特性,也为那些想要在创新之路上取得成功的企业铺平了道路。然后,合适的完成工作,一些高效的工具是必不可少的。幸运的是有足够丰富的工具来支持Java平台。这些工具使得开发过程更加的简单,快捷和高效。通过应用一些完美的工具,开发人员可以生成一个更优美而健壮的代码。抛开烦恼,让我们一窥众多工具中,那些每个Java开发人员都应该知道的工具。 让你变得更加高效的一些Java工具和类库 Clover Clover是一个很赞的工具,它能帮助测试优化,进一步优化代码。它能够在一些持续集成的系统上或者IDE上运行。它认为那些最容易受编码错误影响的东西非常重要。因此,在测试中会更多的关注那些。它不会让最近的一些代码调整而影响到测试速度,还能在测试完代码后快速的给出反馈。 Jar Jar Links: 你 可以已经注意到,同一个产品不同的版本之间,包或者命名空间出现冲突是一种很常见的情况。Jar Jar Links可以避免这种情况,再次创建时会帮助你选择一个合适的包名。这是一个解决依赖问题的理想方案。这个工具和Minijar Maven 插件比较类似,都是解决同样的问题,但是处理方法不一样。 Guava Guava 提供了许多Google核心库,为Java项目提供了很多便利的方法,像并发库、原语支持、集合操作、字符串处理、缓存等等许多方面。 Bintray 当匿名的从仓库导入一些类库,开发人员可能没有提供详细的信息或是文档。不过,通过Bintray这个社交平台,大家可以查看源代码或者在几个开发人员之间共享出来。它的仓库中收录了超过85000个包。你可以轻松的从中找到需要的类库。 JEXL JEXL主要是一种方便嵌入的表达式语言。不要困惑,想简单点,它就是一个库,让一些脚本,Java框架和应用程序动态执行的库。它能帮助企业平台的技术顾问查看一些隐藏的其他脚本功能,并在需要时能自己构建并实现它们。 IntelliJ 由 JetBrains公司开发,IntelliJ 是一个十分智能的Java IDE,提供了一个非常好用的工具集,以确保在最短时间内生产更好更高效的代码。它提供了一个直观友好的界面、运行流畅、稳定的性能。它和Eclipse 非常的相似,可以选择旗舰版或者社区版来使用。旗舰版提供了商业化的IDE功能和完整的工具集并集成了最新的框架。不过,社区版基本上是一个免费开源的版 本,便于Java、Scala和其他的一些语言编程。 Takipi 这个工具主要是用来确定并通知代码中断的原因。它基本上涵盖了所有的新错误,异常还有一些有代表的错误原因。它会将错误和原因摘要直接通知给开发者,便于他们能够以最优的方案迅速的解决错误。 该工具有以下功能: 检测并提示捕捉到的http错误和异常。 分析不同应用程序和机器真正的代码和变量状态。 还能确定一片代码发生错误的次数,并比较发生错误的频率是否增加。 Librato Librato 是一个托管服务,帮助控制和监测云应用程序。只需要几秒钟,就能轻易的配置一个自定义的监控仪表盘。纯语言绑定使用Clojure、Java等语言。支持集成AWS、Heroku等众多云平台来进行数据收集。当监控的指标超过了定义的阀值,会自动生成报警通知。Librato可以完美的表现任何东西,知道如何将数据变有意义。 FindBugs 此工具通过静态分析帮助定位Java程序错误。FindBugs是免费的。可以使用GUI界面,也可以作为NetBeans、IntelliJ、Eclipse等众多IDE的插件。 Plumbr Plumbr旨在解决实时的性能问题。它能完美的检测内存泄露、低效的垃圾收集、还有线程锁等Java应用程序问题。使用它,能确保项目的顺利进行和最好的性能。你只需要将工具加到你的程序上,如果发现任何缺陷的话会有提示。它提供了内存泄漏、泄漏率、发生在代码的实际位置等所有细节信息。所以它能够提供完美的错误信息,帮助你修复代码。 上述工具旨在辅助Java开发,帮助开发人员简单高效的完成任务。最新版本的Java8和这些强大的工具也加强了对软件业务现代化的支持。 作者:佚名 来源:51CTO

优秀的个人博客,低调大师

《UX最佳实践:提高用户体验影响力的艺术 》一2.5 主要经验与建议

2.5 主要经验与建议 经历了项目的各个阶段,我们知道了哪些实践是可行的,哪些需要改进。这曾是一个不断学习的过程,如今我们依然还在学习。本章中推荐的大部分UX实践对你和你的公司应该会有所帮助。但有些实践更适合在流程更复杂的大型公司和全球性组织中执行。你可以听取一些我们的建议,试着在你的公司中执行。你将会知道哪些实践经验是有用的,哪些需要根据自己的实际情况做调整。 2.5.1 关于扩大对技术影响力的建议 明确UI需求的优先级 从客户和用户的角度考虑UI需求的优先级。运用用户研究数据和最终用户UI验证结果证明优先级的正确性。让UI需求变得简单易懂 决策者需要理解UI需求。通过截图表达视觉效果,使用简单易懂的术语。如果你的需求是从可用性测试结果中发现的,还可以播放一段用户界面令用户抓狂的视频,只需要截选亮点即可。为UI架构团队提出需求 在为U

优秀的个人博客,低调大师

提高生产率 物联网将成制造业下一个风口!

作为推动世界高速发展的“重要生产力”,继互联网之后,物联网已造就出另一个万亿级市场。当前,物联网在重新定义人们生活的同时,也在助推我国经济转型升级。 政策市场双驱动 物联网将成制造业下一个风口 2016年以来,随着软银收购ARM、高通收购NXP的落地,IT巨头企业接连布局物联网的举动愈发频繁,智能制造、物联网产业崛起的趋势显露无遗。从世界物联网博览会上的展出情况来看,阿里巴巴、华为、中兴以及三大电信运营商等均已将物联网视为新的业务增长点。 blob.png 同时,物联网更是成为“创新高地”,不断催生新经济、新业态。在江苏,中科物联已在无锡孵化34家企业,其中3家上了“新三板”;影速科技成立三年,销售额已突破8000万元,资本市场估值超过6亿元;中科微至以高速条码识别技术和无线通信技术为核心,从事电商物流分拣装备研发,不到一年获得一亿多元的市场订单。 在备受科技圈巨头青睐的同时,政策的支持也给予很大程度的鼓励。早在2015年7月份,国务院就发布了《关于积极推进“互联网+”行动的指导意见》,明确提出要大力发展智能制造,鼓励制造企业利用物联网、云计算、大数据等技术,整合产品全生命周期数据,形成面向生产组织全过程的决策服务信息,为产品优化升级提供数据支撑。 此外,智能硬件作为物联网入口的延伸也引起了政府部门的注意。2016年9月,工信部联合发改委印发实施了《智能硬件产业创新发展专项行动(2016-2018年)》,意在推动智能硬件产业高端化、创新化、自主化、生态化、服务化发展。报告中指出,到2018年,中国智能硬件全球市场占有率将超过30%,产业规模将超过5000亿元,海外专利占比将超过10%,这为我国未来3年智能硬件发展规划了目标。 在政策的驱动下,物联网技术收获了新的发展热潮。据IHS数据显示,预计到2020年,全球物联网订单将超过1.8亿,市场规模达到300亿美元。华为消费趋势研究所预估,到2025年,物联网设备的数量将接近1000亿,新部署的传感器速度将达到每小时200万个,迅速增长的需求将带动关联领域商业价值的巨大喷发。 另根据IDC最新发布的物联网(IoT)支出报告显示,2016年全球物联网设备相关的总投资金额已达到7370亿美元,其中IoT硬件的采购金额占比30.6%,服务支出占比27.5%,软件支出和通讯连接的占比分别为25.0%和16.9%。 据预测,到2020年,物联网硬件的产值将突破4000亿美元规模,其中模块与传感器等物联网节点设备将占到硬件支出的绝大多数,而在软件部分,超过半数的软件支出将被用于APP应用的研发和维护上。从目前物联网产业的发展趋势来看,物联网、智能硬件的制造业,将是下一代整个制造业的入口。 本文转自d1net(转载)

优秀的个人博客,低调大师

智慧城市提高居民生活水平 实现目标仍有待升华

2015年,中国经济增速持续放缓,智慧城市建设从盲目追捧期走向实施落地期,智慧城市建设投资逐渐回归理性。2015年是“十二五”收官之年,在国家相关政策和智慧城市试点工作的推动下,2015年中国智慧城市市场IT投资规模达到2480亿元,年投资增长率为20.4%。“十三五”对智慧城市有着很高的憧憬,但是智慧城市说到底还是一种提升居民生活的技术手段,目前的智慧城市重点是从以下几个领域入手: 智能交通 智能交通在智慧城市建设中有着举足轻重的地位,就目前来看智能交通主要覆盖的层面有:智能交通的基础层,即城市交通灯系统与高速公路的信息化建设,包括对原来交通系统的改造;智能交通的设备层,即实现智能交通所需要的视频监控设备、射频追踪设备以及公路照明设备等;智能交通的软件层,即导航地图、地理信息系统以及云平台等软件应用等。 可以看到,目前的智能交通系统相对来说还只是一种比较被动的“智能”,主要是在原来的基础上进行一定量的改造。这在路况正常的前提下是一种锦上添花的表现——驾驶确实更加的方便,但是在极端条件下,面对路况遭到破坏依然显得“笨拙”与无能为力。比如说碰到极端寒冷时路面结冰,就会造成整个交通系统瘫痪。所以,智能交通应该需要增加一些主动处理极端条件下的能力。 智能物流 随着技术的发展,智能物流将会在智慧城市中扮演越来越重要的角色,物流在GDP中所占的比重不可忽略。据统计,在过去很长一段时间内,中国的社会物流总费用占GDP的18%左右,也就是达到10万亿级别总市场。 正因为如此,采用智能物流,增加物流的速度与效率从而降低物流总成本占GDP的比例显得尤其的重要。而打造一个完善的智能物流网,整合所有快递公司将会是一种趋势,充分利用目前的资源,实现共享,把货物流通的数据打通,形成一个巨大的即时信息平台,最终实现网上下单购物,24小时内送达。 智能物流看的是货件的管理能力与运输能力,在极端天气的条件下对于物流的影响也是极大的,所以打造一套完善的,足以抵抗极端自然条件下的物流系统也是有重要意义的,比如说,一套完善的无人机运输网络,可以很好的抗击路面交通不流畅的情况。 智能电网 国家能源局曾经表示,中国在未来5年内智能电网建设总投资规模将超过2万亿元,这对于智能电网的市场来说,是一剂强有力的催化剂,将会方便整个市场的成熟与落地。 国家投的2万亿主要是对于骨干网络的智能化升级,比如说智能变电站、智能巡视系统,或者智能电表。而这其中辐射出来的电网ICT产业市场也是很大的,然而智能电网所面临的来自于极端天气的挑战也是最严重的。所以对环境的实时监控与故障预警将会显得尤为重要。 首先是需要对现有的输点设备进行加固处理,以增加其自身的抗极端天气的能力;然后可以通过数据的分析与预警,对电线等设备可能出现的隐患进行及时的处理。这都将提升智能电网在天灾中的生存能力。 关于智慧城市 智慧城市的概念还是很大的,上述三点就是比较典型的代表,其实关于智慧城市是什么,可能一千个人眼中有一千种不同的看法,智慧城市之于不同的人、不同角色、站在不同立场,都会有不同的定义。 上班族说:“路上不那么堵,过年回家买票不那么难,就是智慧城市。”;老人家说:“我有心脏病,如果我在家里突然跌倒爬不起来了,有人能很快把我送到医院,就是智慧城市。”;小孩子说:“我不想一板一眼地坐在教室里上课,要是在家就可以学习,能向老师提问,还能跟小伙伴交流,就是智慧城市。”;创业者说:“我想办个公司,可是不知道流程,也不知道去哪里找到合作伙伴,如果这一切都更加方便,就是智慧城市。”;公务员说:“为什么有那么多上访的人呢,如果他们的想法能早点跟我们沟通解决,大家其乐融融,就是智慧城市。”;消防员说:“最好没有火灾,有烟雾苗头就能自动扑灭,但假如真正有大火了,我们能一路畅通地迅速抵达现场,这就是智慧城市。” 而这些也都是能够使得智慧城市脱离面子工程,达到实实在在的惠民目的的场景,智慧城市是融合人类的智慧而非技术的智慧,说到底还是一种提升居民生活的技术手段。 或许利用大数据、云计算、人工智能等物联网手段可以使得智慧城市达到很不错的“智商”,能够进行复杂的运算及问题处理。但是既然是智慧就总得有一定的“生气”,才会让人觉得有活力。连最简单的单细胞生物都有一种趋利避害本能反应,所以,一套高级的智慧城市系统不应只是一台死气沉沉的机器。 毫无疑问,在目前的条件下,当遭遇冰灾、雪灾、台风、甚至地震等极端的自然条件时,智慧城市的“智慧”二字就会显得太过脆弱与无能为力,或许当有一天,智能城市能够真正的主动进行适当的反应,去解决一些突发状况时,才会是智能城市的又一次升华。 本文转自d1net(转载)

优秀的个人博客,低调大师

成本降低40%、资源利用率提高20%的 AI 应用产品云原生容器化之路

作者 郭云龙,腾讯云高级工程师,目前就职于 CSIG 云产品三部-AI 应用产品中心,现负责中心后台业务框架开发。 导语 为了满足 AI 能力在公有云 SaaS 场景下,服务和模型需要快速迭代交付的需求,保障服务在不稳定高并发时的高成功率,以及进一步提升资源利用率,AI 应用产品中心进行了一系列的调研与实践,本篇将重点介绍团队在容器化方面的实践经验。 背景和问题 公有云 AI SaaS 产品(如人脸融合)的一般服务流程为:C 端或 B 端客户通过采集设备采集图像、音视频等,经由云 API 等接入方式传入,服务端利用强大的计算能力、充足的资源和相对成熟的算法对客户输入的多媒体内容进行处理。 如上图所示,对于一般流程来说,我们面临着三个挑战。 采集质量不稳定:由于采集设备之间存在差异,采集到的质量也会存在差异,拿图像处理来说,大图和小图会给我们的服务带来不同的压力,有时服务会因为集中的大图并发产生失败。 短期、高并发需求多:我们的客户会用我们的能力实现不同的玩法,使用人脸融合来进行游戏活动宣传就是一个很常见的运营手段,但是这种活动会给我们的服务带来短期内的高并发压力。 模型、服务迭代快:AI SaaS 服务的竞争非常激烈,经常会有客户提出新的需求,加上算法难免会有 badcase,所以我们的服务也要进行很频繁的升级迭代。 我们再来看下我们容器化前的精简架构(如上图所示),物理机的开发部署大背景下,我们的逻辑服务不论是结构上还是基础上都属于大泥球模式,另外算法服务也常有混布的现象存在。 这种架构也导致了忙时服务间抢占资源的情况频繁发生,影响服务成功率及耗时,导致我们没有办法很好的满足客户的需求;而闲时资源利用率非常低,容易造成资源浪费。 以两个实际的例子来说明: 升级发布时,我们需要先从LB中剔除一个节点,并在节点上观察没有流量进入后进行服务升级。升级完成后,人工对服务进行成功性检测,检测结果ok后再加回LB中。 客户搞活动时提出高并发需求,如果当前物理机/vm资源池不满足,需要向资源同学紧急提物理机需求,资源同学协调到机器后,我们需要人工对机器环境/网络重新初始化,然后执行上述1操作。待活动结束后机器闲置,易造成成本浪费。 为了更好的满足客户不断迭代的需求,减轻研发的运维负担,补齐弹性能力和接入高效的服务管控平台对我们来说是迫切需要的。趁着公司推动上云的时机,我们对架构组件进行了几轮调研和优化。本文主要对容器化过程进行阐述。 容器化过程记录 我们的容器化上云到现在为止可以分为三步:容器化,稳定性提升和利用率提升。 容器化 这里的容器化映射到业务上来说,除了将服务载体由物理机迁移到容器上,更主要是将原来的复杂逻辑解耦,微服务化。 如下图所示,我们先对服务本身做了瘦身微服务化,另外借助于容器的能力,将原来混布的服务彻底分开。如何进行微服务化会因业务的不同存在差异,本篇对此不做赘述。 稳定性提升 在第一步容器化之后,我们很快享受到了飞一般的服务升级和扩容速度。同时对容器化比较浅显的理解也给我们带来了一些新的问题。 调用量波动较大的服务由于频繁扩缩容导致业务失败 一些客户传的大图在低核容器上处理效率较低 集群资源紧缺导致的容器无法按需扩容等。 对于上述三个问题,我们也分别找出了应对方案。 灵活使用探针 起初我们的服务都是没有设置存活和就绪检测(探针 )的,Prestop 给缩容时加上了一层保护,但是并不彻底,而且在扩容时难免会有服务失败。 探针给我们提供了另一种强大的解决方式。一开始时,我们参照链接中的示例,进行简单的端口检查来判断服务是否正常运行。后来我们发现了更多灵活的运用技巧和使用场景。以下列出几个例子供大家参考以及发散出更多有趣实践。 例子1:在一开始时大家经常遇到 LB Agent 启动时获取路由必然失败的情况,我们可以使用就绪探针来进行 LB 的预加载(如下图),即可达到 LB 获取成功后标记服务启动成功的效果。 例子2:由于一些低版本OS的实例存在弱口令的问题,大家需要把所有依赖旧版OS的镜像全部升级,这个工作对我们来说是及其繁重的,于是我们同样利用了探针,在容器标记服务启动前把弱口令全部干掉。 例子3:某个服务比较特殊,内存占用经常波动,当内存小于某个值时,服务会偶现失败,但是端口正常存活。这时我们可以使用 ConfigMap+python 脚本来进行一些复杂的检测: 针对大图进行筛选适配 容器化后,我们发现某个算法在接收到高分辨率图片时,服务成功率会出现波动,原因是算法在对提特征时会出现更多的消耗,这一现象在物理机上部署时被物理机核数多的优势掩盖住了,一旦到了核数较低的容器上就显露了出来。为了解决这个问题,我们在上层逻辑中新增了大图筛选功能(如下图所示),如果检测到是大图,则走回物理机集群(由于初始时 TKEx 提供最高规格容器核数为 8 核,后来才扩充支持了 24 核及以上),如果是一般图片,则走容器集群。 多集群部署 在使用 TKEx 时,我们经常会碰到部署的 workload 会因为整体集群资源不足的原因,无法扩容到指定的 max 值,一度非常苦恼。 TKEx 的同学也是推荐我们在其他的集群复制一份资源,当一个集群扩不出来时,另一个集群充当备份角色。在这么调整过后,我们的扩容成功率逐步上升。 后来又出现了整个地域的资源都比较紧缺的情况,于是我们把一些对时延不那么敏感的服务进行了多地域部署(如下图),最终将集群资源不足的风险进一步降低。 当一地资源不足的情况下使用多地域部署以及 LB 时,一般 LB 都会根据后端响应时间动态调整各节点权重,所以我们应注意以下两点: 关闭就近访问 根据上下游调整 LB 权重(比如上游服务部署在广州,下游同时部署了南京和广州,这是南京和广州的 LB 权重分别为130,100) 利用率提升 在进行过一轮稳定性提升之后,我们可以更加自信的利用弹性能力,利用率也有了显著提升。不过依旧有两个问题阻碍着我们的利用率更进一步。一个是有些服务模型大,启动慢,流量突增时服务无法很及时的扩容出来,这时我们必须要提前占用一些资源导致利用率提不上去。 针对第一个问题,我们挑选了部分流量有规律的服务。利用 TKE 提供的定时 HPA 能力,在已知流量高峰前定时进行一轮扩容。 成果 优化前 优化后 资源占用 1500+CPU 物理机 ( 8w+ 核)800+GPU 物理机 (P4 1600 卡) CPU 6w 核 T4 1000 卡 资源利用率 10% 30% 成本 - -40% 服务成功率 99.9% 99.95% 服务扩容效率 小规模 (<2000核): 3 小时 大规模: 2天 小规模 (<2000核): 10分钟 大规模: 6小时 服务升级效率 小规模 (<50实例): 6 小时 大规模: 2天 小规模 (<50实例): 30分钟 大规模: 6小时 当前我们的 AI 服务已经基本完成容器化的升级。成功率高,扩容快,欢迎大家扫码进行体验。 关于我们 更多关于云原生的案例和知识,可关注同名【腾讯云原生】公众号~ 福利:公众号后台回复【手册】,可获得《腾讯云原生路线图手册》&《腾讯云原生最佳实践》~ 【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!

优秀的个人博客,低调大师

百度混部实践系列 | 如何提高 K8S 集群资源利用率?

【导读】随着Kubernetes(以下简称『K8S』)被业界越来越广泛地使用,单个集群规模也逐渐增大,很多人都会发现自己维护的 K8S 集群普遍存在一个问题:分配率较高,而利用率偏低。 比如,一个有1000+节点的集群,在分配率达到80%后,常常会因为集群碎片的原因,很多大规格的 Pod 就无法再被创建出来。而与此同时,整个集群的日均 CPU 利用率却不足15%,常态使用率偏低。那么,如何才能把剩余的闲置资源尽可能利用到极致呢? 今天这篇文章,是百度云原生团队分享云原生混部实战的第一弹,我们一起探索 K8S 原理,用 K8S 原生的方式来解决这个问题。 1.原生 K8S 能否解决资源利用率问题? 首先,我们来看下图这个示例。图中黄色框代表2个 Node,这两个 Node 的 CPU 总数都是40核,并且都已经分配了38核。其中 NodeA 的真实用量是35核,NodeB 的真实用量是10核。而蓝色框则代表现在我们还有3个待调度的 Pod。 若想调度3个 Pod: PodA 的 Request 和 Limit 都是5c,此时它无法被调度,即使Node B上还有空闲资源; PodB 的 Request 为1c,Limit 为10c,该 Pod 超发比较严重,它可以被调度到 NodeA 或 NodeB,但是调度到 NodeA 时可能被驱逐; PodC 的 Request 和 Limit 都没有填写,此时它可以被调度,但是当调度到 NodeA 时可能被驱逐 基于以上场景,可以尝试总结一下为什么原生 K8S 没办法直接解决资源利用率的问题: 第一,资源使用是动态的,而配额是静态限制。在线业务会根据其使用的峰值去预估Quota(Request和Limit),配额申请之后就不能再修改,但资源用量却是动态的,白天和晚上的用量可能都不一样。 第二,原生调度器并不感知真实资源的使用情况。所以对于 PodB,PodC 这种想要超发的业务来说,无法做到合理的配置。 基于这些原因,团队进行了下一阶段的方案设计:引入动态资源视图 2.引入动态资源视图 通过添加一个 Agent 去收集单机的资源用量情况,并且汇总计算得到动态的资源视图(机器真实的用量情况),将其上报到调度器,在调度器中配置相关策略,可以将上文中提到的 PodB 和 PodC 准确的调度到 NodeB 上。 也就是说通过构建资源视图,可以将 Limit 大于 Request 的 Pod 或者没填 Request 和Limit 的 Pod,调用到真实用量更少的 Node。这个方法可以解决由于不知道机器到底用了多少资源,所以调度失败被驱逐的问题,最终达到提升 CPU 利用率的效果。 但是这样做需要付出什么代价?如果要将 PodB 和 PodC 调度到 NodeB 上,NodeB 的配额只多分配了1核,但是用量却上升了20核,这就造成了超量使用。(申请量非常少,但是用量非常多) 对于 Node B,多用的20核其实是已经分配出去的 Pod 没有用到,暂时让出的。 为了方便理解举个例子:因为工作需要,我申请了三台电脑,平时大部分情况只用一台,剩下的两台可以借给其他同事暂时用一用;但是我申请3台也是有原因的,有时候是真的要用到的,那当有用到的时候,同事就必须要还给我,所以这就涉及到一个『如何借』和『如何还』的问题。 2.1 借用的代价:不稳定的生命周期 在上述的调度情况下,如果 PodC 用量持续增长,整体的负载可能超过了对单机设备的驱逐上限,会触发单机 kubelet 的驱逐行为。 对应到上述的例子中,如果我共有三台电脑,平时只用一台,外借了两台。现在由于工作需要我要多用一台(整体用量上涨),在这种情况下我并不需要一次性把两台电脑都收回(驱逐 Pod),而是仅收回我需要的那一台即可。 比如在 CPU 层面,可以尝试先降低 PodC 的 CPU Quota;在内存层面,可以先尝试进行内存回收。换句话说,可以优先考虑降低资源使用情况,而不是直接驱逐掉 Pod。 因此有两个核心问题要解决:第一,动态资源视图要如何做;第二个单机资源的调配如何保证供给。 2.2 单机引擎:隔离与退避 名词解释:Guaranteed-Pod、Burstable、BestEffort K8S中的QoS是根据request 和limit动态算而来: request等于limit,会被放到Guaranteed-Pod之中 request不等于limit,会被放在这个Burstable(突发型)目录下 request和limit都没有填,会被放在BestEffort目录下 上图灰色框的部分是 kubelet 为每个 Pod 设置 Cgroup 的目录结构:首先有一个一级目录叫 kubepod,所有 Pod 的 Cgroup 都会被挂到它下面,图中有两个红色字体的 Guaranteed-Pod 是直接被挂载到 kubepod 目录下。 图中红色字体部分(Guaranteed-Pod, Burstable-Pod)的目录由 kubelet 给它们设置 Quota。以CPU为例,比如 Limit 填 5,Quota 就会设置为 5。白色字体部分是没有 Quota 限制的( kubepod 和 BestEffort-Pod),可以看到的是 Burstable,BestEffort 这两种 Pod 没有直接挂在 kubepod 目录下,而是自己有一个原本是空白的没有值的二级目录。 在树形结构下 Cgroup 有如下特点:单个目录下进程使用的资源限制并不仅仅受自己所在节点的限制,还要受父节点的限制。比如在 Burstable 的框下边有两个Pod(图无关),在 Burstable 那个框设置了一个 Quota 是 10c,那这两个 Burstable-Pod 的 CPU 用量总和不能超过 10c。 基于这个原理团队设计了对应的压制策略,单机引擎会根据 Guaranteed-Pod 的真实用量去给 Burstable 目录整体设置了一个值,这个值通过动态计算而来。简单来说,会先计算一下 Guaranteed-Pod 现在用多少,还剩多少资源可以给到 Burstable。BestEffort也是类似的,会先计算 Guaranteed 和 Burstable 现在的 Pod 的用量是多少,然后给框整体设定一个值。 如果单机的用量起来了,即申请的 Pod 现在要把自己借出去的这部分资源拿回来了,如何处理?此时会通过动态计算缩小 Burstable 和 BestEffort 的这两个框的值,达到一个压制的效果。 在不考虑整机 Quota 超发的情况下,如果整机 Quota 都分完了, 整机 Pod 资源用量又在持续上涨,这种情况要如何处理? 当资源用量持续上涨时,如果 BestEffort 框整体 CPU 用量小于 1c ,单机引擎会把 BestEffort Pod 全部驱逐掉。K8S 本身在单机发生资源紧张的时候,也是会按照这种顺序去驱逐相应的Pod。当Guaranteed-Pod的用量还在持续上涨的时候,就会持续的压低 Burstable 整框 CPU 的Quota,从而达到压制的效果。 Burstable 类型的 Pod 的特征是 Request 不等于 Limit , 该类型的 Pod 申请了相应资源的 Quota, 在这个前提下,Burstable 框内的Pod,最低会压到本来申请的资源量。比如 Burstable 框下只有一个Pod,Request是1c,Limit是10c,那么单机引擎最低会将 Burstable 整框压制到 1c。 换言之,对于 Request,就是说那些用户真实申请了 Quota 的资源,一定会得到得到供给;对于 Limit - Request 这部分资源,单机引擎和调度器会让它尽量能够得到供给;对于 BestEffort,也就是 No Limit 这部分资源,只要单机的波动存在,就存在被优先驱逐的风险. 但是对于一些长尾延迟来说,仅仅通过上述 K8S 的手段,保证不了服务质量。发生争抢时,系统 load 就会比较高。所以团队引入了内部的一些内核功能,并且对它进行一些扩展和支持,基本包括以下几类: 2.3 单机引擎:构建资源视图 单机 Agent 需要收集两部分资源:Pod 的资源使用情况以及整机的资源使用情况(包括机器内核指标),实时计算实时发生行为同时实时计算上报一份已经算好的数据,可以减轻调度器的计算压力。 中等质量容器可用量 = 单机最大 CPU 用量 - 高质量容器用量 -Safety-Margin 低等质量容器可用量 =单机最大 CPU 用量 - 高质量容器用量 - 中等质量容器用量 -Safety-Margin 这里的 Safety-Margin 是安全水位线,作为预留buffer能够避免用量突然的上涨导致整机突然被打满。 这样就构造出了一个单机的资源视图,将其上报到调度器,调度器将此视图来作为调度依据进行优选和预选的策略。 同时单机上还有一些可定制化的策略。通过给这些策略设计了一个这个 CRD ,单机引擎通过对 APIServer 发起 List-watch,实时的 Watch CR 的变更,实时调整参数和相关策略。 2.4 超发的结果:质量分级 以上,团队完成了在 K8S 上混部探索的第一阶段,这个方案基于 K8S 没有做侵入式改动。 但是在对接用户时经常要面对两个问题:一是用户不知道 Request 和 Limit 要怎么填? 需要先对相关概念做科普: Request 部分,代表是稳定的,安全的,只要申请了就一定可以用到的资源.。 Limit 减去 Request 部分,比如说申请的 Request 是5,Limit 是10,中间的 5核 的差距是相对来说不稳定,但大概率能够得到供给的资源。如果说有需要的时候,系统会尝试把该 Pod 超用的资源压缩回去。 No Limit,就是既不写 Request 也不写 Limit 的部分会尽量保证,但是资源供给 sla 会是一个比较低的数字,用这部分资源就要有随时被杀掉的准备。 第二个问题是如果可能,用户是否都倾向于用第一种 Request 级别的资源? 答案是否定的。事实证明,如果能把成本降下,一些鲁棒性高的业务是愿意接受低质量资源的。 比如一些不敏感的离线业务,如果被 kill,代价就是过一会再跑或者重新算一遍,它是乐于接受这种这个低质量资源的,前提条件是系统要给一个很低的成本。 因此团队构造了下图的成本模型,对于不同质量的资源,有不同的定价。作为平台方给用户结算计费的时候,会根据实际的用量和质量的乘积进行结算。 比如 K8S 集群中托管的机器没开混部,定价可能是D(假设D为1);在开了混部的集群当中,用户去用这些 Request,价格可能就是0.85;在开了混部的很多集群当中,用户用 Limit 部分的话,价格可能就是0.5;如果用 Besteffort 部分,那可能它的价格是0.1。 通过这种方式,找到了第一批的这个种子用户。不管是在线业务、离线业务、测试业务,还有一些内部 DevOps 业务,都非常愿意根据这个成本模型再重新审视自己的业务模型, 选择对应的资源等级来运行自己的业务。 3.落地之后遇到了哪些问题 热点问题 : 保证了用量, 如何保证质量? 热点问题并不仅仅是混部带来的,在线跟在线业务部署在同一台机器上也有这个问题。比如资源的争抢、内核关键路径的争抢都可能导致延迟的上升。在百度内部如果搜索的一个接口,由于混部质量导致延迟超过一百毫秒的话,影响面就会非常大,因为业务的链路通常都比较长,延迟累计最终给用户响应的时间可能达到秒级,这种情况是不可接受的。 除了内核提供的隔离技术外,如何给出热点问题的兜底方案? 答案是热点迁移,出现热点,系统自动迁移容器。具体而言,单机引擎会通过收集应用的一些指标来判断这个应用是否发生热点。如果发生热点的话,就会给一个机器上打一个 Annotation,然后当调度器 Watch 到这个 Annotation 时,它就会认为台机器上发生了热点,就要迁移热点容器。 Pending Pod : 低质量需求激增带来的调度性能需求 以某用户跑数的场景为例,假设他预计需要1000核资源,要在明天早上9点完成,因此他就申请了1000核高质量的资源,同时他又申请了1万核 Besteffort 的资源一块跑,通过了1万核的低质量的资源加速,可能不用明早9点,半夜1点就跑完了,剩下的这部分成本就了省下来。 但是用户这种使用方法会给调度器的性能带来很大影响,在集群负载较高时,用户创建的 BestEffort Pod 由于资源不足导致全部 Pending,而这些 Pending Pod 会反复的出现在调度队列中,针对这种场景,我们尝试对离线调度器进行功能和性能上的优化 : 副本数托管: 基于集群负载对应用进行动态扩缩容。社区叫 HCPA,用户通过创建一个 CR 来描述任务的最低的副本数是多少,最高的副本数是多少,当集群负载发生变化的时候,Controller 可以动态的扩缩用户的任务副本数,而不再是静态的创建出海量的 Pending Pod, 阻塞在队列中。 多调度器: 基于质量的多调度器。对 Besteffort 的容器来说, 在调度时调度器并不关心静态资源视图,也就是 Node Allocatable Resource。调度器只关心这台机器上现在还剩多少可用资源,所以在资源视图的角度,天然就和其他两种质量的 Pod 不冲突. 基于这个前提,我们将 Guaranteed 和 Burstable 两种类型的 Pod 归并到一个调度器内进行调度, 而 BestEffort 类型的 Pod 则在另外一个离线调度器内调度。 等价类合并: 在一个调度周期内, 使用相同 Pod Template 生成的 Pod, 在进行调度计算时一定会得到相同的 Node 列表。基于这个前提, 在调度上我们构造了等价类的概念,在调度时单位从 Pod 变成了 PodEquivalenceGroup. 在优选结束后, 会按照 Node 分数的顺序来依次调度 PodEquivalenceGroup 中的所有 Pod。这样处理相当于将 O(n) 的调度计算降为了 O(1)。 乐观并发调度: 目前开源的 Kubernetes 调度器, 无论是默认调度器还是社区的 kube-batch, volcano 都是依次进行调度的,队头阻塞的现象较为严重。在优先级相同的情况下, 最后一个 Pod 的调度延迟约等于队列内所有 Pod 的调度延迟之和。并发的关键在于如何解决冲突 : 在调度器内存中为每一个 Node 维护了一个版本号, 当 Pod 与 Node 进行 Bind 操作时, 会尝试对 Node 版本号进行 +1 的 CAS 操作, 如果失败,则说明该 Node 已经发生过 Bind 操作, 此时会将该 Node 重算并重新尝试调度。基于 CAS + Version 的机制, 我们实现了同优先级情况下, Pod 并发调度的方案。该方案可以带来 4 ~ 8 倍的调度性能提升。 4.总结 K8S 原本的资源模型存在局限性。我们可以基于原生的 QOS 体系做一些不修改原本语义的扩展行为,并且基于质量建立相应的定价体系,通过给出不同质量的资源供给 SLA,来对资源进行差异化定价,从而引导用户更加合理地使用资源。目前我们在做的进一步探索是,如何根据业务特征,来划分出更适合业务的,更细粒度的资源模型。 建立云原生可观测体系,根据质量去做单机资源的隔离/压制以及驱逐行为。因为在常见混部的情况下热点问题经常发生,由于热点对延迟敏感型业务会造成较大的影响,所以热点问题事实上限制了整机最大的资源利用率。而热点问题根因通常在内核层面,内核的可观测性又比较差,因此目前百度云原生团队在探索基于 ebpf 来建立更细粒度的热点探测/分析体系。 大规模混部落地后,需要对热点问题、调度性能等问题给出解决方案。后续持续迭代相应的调度功能,在调度性能和支撑大数据业务容器化上做出更进一步的探索。 - End - 点击进入了解更多技术资讯~~

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册