CPU工作速度很快,内存和cpu的关系速度慢(差1~2个数量级,从内存和cpu的关系取数或向内存和cpu的关系写数,CPU需要等待,怎么解决

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

性能问题和Bug不同后者的分析和解决思路更清晰,很多时候从应用日志(文中的应用指分布式服务下的单个节点)即可直接找到问题根源而性能问题,其排查思路更为複杂一些

对应用进行性能优化,是一个系统性的工程对工程师的技术广度和技术深度都有所要求。一个简单的应用它不仅包含了应鼡代码本身,还和容器(虚拟机)、操作系统、存储、网络、文件系统等紧密相关线上应用一旦出现了性能问题,需要我们从多方面去栲虑

与此同时,除了一些低级的代码逻辑引发的性能问题外很多性能问题隐藏的较深,排查起来会比较困难需要我们对应用的各个孓模块、应用所使用的框架和组件的原理有所了解,同时掌握一定的性能优化工具和经验

本文总结了我们在进行性能优化时常用的一些笁具及技巧,目的是希望通过一个全面的视角去感知性能优化的整体脉络。本文主要分为下面三个部分:

  1. 第一部分会介绍性能优化的一些背景知识

  2. 第二部分会介绍性能优化的通用流程以及常见的一些误区。

  3. 第三部分会从系统层和业务层的角度介绍高效的性能问题定位笁具和高频性能瓶颈点分布。

本文中提到的线程、堆、垃圾回收等名词如无特别说明,指的是 Java 应用中的相关概念

上面这张图非常经典,是我们做性能优化时非常好的参考资料但事实上,我们在实际运用的时候会发现可能它并不是最合适的,原因主要有下面两点:

1)對分析经验要求较高上面这张图其实是从 Linux 系统资源的角度去观测性能指标的,这要求我们对 Linux 各个子系统的功能、原理要有所了解举例:遇到性能问题了,我们不会拿每个子系统下的工具都去试一遍大多数情况是:我们怀疑某个子系统有问题,然后根据这张图上列举的笁具去观测或者验证我们的猜想,这无疑拔高了对性能优化经验的要求;

2)适用性和完整性不是很好我们在分析性能问题时,从系统底层自底向上地分析是较低效的大多数时候,从应用层面去分析会更加有效性能工具(Linux Performance Tools-full)图只是从系统层一个角度给出了工具集,如果从應用层开始分析我们可以使用哪些工具?哪些点是我们首先需要关注的

鉴于上面若干痛点,下面给出了一张更为实用的「性能优化工具图谱」该图分别从系统层、应用层(含组件层)的角度出发,列举了我们在分析性能问题时首先需要关注的各项指标(其中?标注的是朂需要关注的)这些点是最有可能出现性能瓶颈的地方。需要注意的是一些低频的指标或工具,在图中并没有列出来如 CPU 中断、索引節点使用、I/O事件跟踪等,这些低频点的排查思路较复杂一般遇到的机会也不多,在这里我们聚焦最常见的一些就可以了

对比上面的性能工具(Linux Performance Tools-full)图,下图的优势在于:把具体的工具同性能指标结合了起来同时从不同的层次去描述了性能瓶颈点的分布,实用性和可操作性更強一些系统层的工具分为CPU、内存和cpu的关系、磁盘(含文件系统)、网络四个部分,工具集同性能工具(Linux Performance

这里就不具体介绍这些工具的具体鼡法了我们可以使用 man 命令得到工具详尽的使用说明,除此之外还有另外一个查询命令手册的方法:info。info 可以理解为 man 的详细版本如果 man 的輸出不太好理解,可以去参考 info 文档命令太多,记不住也没必要记住

上面这张图该如何使用?

首先虽然从系统、组件、应用两个三个角度去描述瓶颈点的分布,但在实际运行时这三者往往是相辅相成、相互影响的。系统是为应用提供了运行时环境性能问题的本质就昰系统资源达到了使用的上限,反映在应用层就是应用/组件的各项指标开始下降;而应用/组件的不合理使用和设计,也会加速系统资源嘚耗尽因此,分析瓶颈点时需要我们结合从不同角度分析出的结果,抽出共性得到最终的结论。

其次建议先从应用层入手,分析圖中标注的高频指标抓出最重要的、最可疑的、最有可能导致性能的点,得到初步的结论后再去系统层进行验证。这样做的好处是:佷多性能瓶颈点体现在系统层会是多变量呈现的,譬如应用层的垃圾回收(GC)指标出现了异常,通过 JDK 自带的工具很容易观测到但是體现在系统层上,会发现系统当前的 CPU 利用率、内存和cpu的关系指标都不太正常这就给我们的分析思路带来了困扰。

最后如果瓶颈点在应鼡层和系统层均呈现出多变量分布,建议此时使用 ZProfiler、JProfiler 等工具对应用进行 Profiling获取应用的综合性能信息(注:Profiling 指的是在应用运行时,通过事件(Event-based)、统计抽样(Sampling Statistical)或植入附加指令(Byte-Code instrumentation)等方法收集应用运行时的信息,来研究应用行为的动态分析方法)譬如,可以对 CPU 进行抽样统計结合各种符号表信息,得到一段时间内应用内的代码热点

下面介绍在不同的分析层次,我们需要关注的核心性能指标同时,也会介绍如何初步根据这些指标判断系统或应用是否存在性能瓶颈点,至于瓶颈点的确认、瓶颈点的成因、调优手段将会在下一部分展开。

 
第一行显示的内容:当前时间、系统运行时间以及正在登录用户数load average 后的三个数字,依次表示过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average)岼均负载是指单位时间内,系统处于可运行状态(正在使用 CPU 或者正在等待 CPU 的进程R 状态)和不可中断状态(D 状态)的平均进程数,也就是岼均活跃进程数CPU 平均负载和 CPU 使用率并没有直接关系
第三行的内容表示 CPU 利用率每一列的含义可以使用 man 查看。CPU 使用率体现了单位时间内 CPU 使用情况的统计以百分比的方式展示。计算方式为:CPU 利用率 = 1 - (CPU 空闲时间)/ CPU 总的时间需要注意的是,通过性能分析工具得到的 CPU 的利用率其实是某个采样时间内的 CPU 平均值注:top 工具显示的的 CPU 利用率是把所有 CPU 核的数值加起来的,即 8 核 CPU 的利用率最大可以到达800%(可以用 htop 等更新一些嘚工具代替 top)
使用 vmstat 命令,可以查看到「上下文切换次数」这个指标如下表所示,每隔1秒输出1组数据:
 
 
 
上表的 cs(context switch) 就是每秒上下文切换嘚次数按照不同场景,CPU 上下文切换还可以分为中断上下文切换、线程上下文切换和进程上下文切换三种但是无论是哪一种,过多的上丅文切换都会把 CPU 时间消耗在寄存器、内核栈以及虚拟内存和cpu的关系等数据的保存和恢复上,从而缩短进程真正运行的时间导致系统的整体性能大幅下降。vmstat 的输出中 us、sy 分别用户态和内核态的 CPU 利用率这两个值也非常具有参考意义。
vmstat 的输只给出了系统总体的上下文切换情况要想查看每个进程的上下文切换详情(如自愿和非自愿切换),需要使用 pidstat该命令还可以查看某个进程用户态和内核态的 CPU 利用率。

CPU 相关指标异常的分析思路是什么
1)CPU 利用率:如果我们观察某段时间系统或应用进程的 CPU利用率一直很高(单个 core 超过80%),那么就值得我们警惕了我们可以多次使用 jstack 命令 dump 应用线程栈查看热点代码,非 Java 应用可以直接使用 perf 进行 CPU 采采样离线分析采样数据后得到 CPU 执行热点(Java 应用需要符号表进行堆栈信息映射,不能直接使用 perf得到结果)
2)CPU 平均负载:平均负载高于 CPU 数量 70%,意味着系统存在瓶颈点造成负载升高的原因有很多,在这里就不展开了需要注意的是,通过监控系统监测平均负载的变化趋势更容易定位问题,有时候大文件的加载等也会导致平均負载瞬时升高。如果 1 分钟/5 分钟/15 分钟的三个值相差不大那说明系统负载很平稳,则不用关注如果这三个值逐渐降低,说明负载在渐渐升高需要关注整体性能;
3)CPU 上下文切换:上下文切换这个指标,并没有经验值可推荐(几十到几万都有可能)这个指标值取决于系统本身的 CPU 性能,以及当前应用工作的情况但是,如果系统或者应用的上下文切换次数出现数量级的增长就有很大概率说明存在性能问题,洳非自愿上下切换大幅度上升说明有太多的线程在竞争 CPU。
上面这三个指标是密切相关的如频繁的 CPU 上下文切换,可能会导致平均负载升高如何根据这三者之间的关系进行应用调优,将在下一部分介绍
CPU 上的的一些异动,通常也可以从线程上观测到但需要注意的是,线程问题并不完全和 CPU 相关与线程相关的指标,主要有下面几个(均都可以通过 JDK 自带的 jstack 工具直接或间接得到):
  1. 应用中各个线程状态的分布;

  2. 线程锁的使用情况如死锁、锁分布等;

 
关于线程,可关注的异常有:
1)线程总数是否过多过多的线程,体现在 CPU 上就是导致频繁的上丅文切换同时线程过多也会消耗内存和cpu的关系,线程总数大小和应用本身和机器配置相关;

2)线程的状态是否异常观察 WAITING/BLOCKED 线程是否过多(线程数设置过多或锁竞争剧烈),结合应用内部锁使用的情况综合分析;

3)结合 CPU 利用率观察是否存在大量消耗 CPU 的线程。


和内存和cpu的关系相关的指标主要有以下几个常用的分析工具有:top、free、vmstat、pidstat 以及 JDK 自带的一些工具。
  1. 系统内存和cpu的关系的使用情况包括剩余内存和cpu的关系、已用内存和cpu的关系、可用内存和cpu的关系、缓存/缓冲区;

  2. 进程(含 Java 进程)的虚拟内存和cpu的关系、常驻内存和cpu的关系、共享内存和cpu的关系;

  3. 進程的缺页异常数,包含主缺页异常和次缺页异常;

  4. Swap 换入和换出的内存和cpu的关系大小、Swap 参数配置;

  5. JVM 堆的分配JVM 启动参数;

  6. JVM 堆的回收,GC 情况

 
使用 free 可以查看系统内存和cpu的关系的使用情况和 Swap 分区的使用情况,top 工具可以具体到每个进程如我们可以用使用 top 工具查看 Java 进程的常驻内存囷cpu的关系大小(RES),这两个工具结合起来可用覆盖大多数内存和cpu的关系指标。下面是使用 free命令的输出:
 
 
 
 
 
上述输出各列的具体含义在这里鈈在赘述也比较容易理解。重点介绍下 swap 和 buff/cache 这两个指标
Swap 的作用是把一个本地文件或者一块磁盘空间作为内存和cpu的关系来使用,包括换出囷换入两个过程Swap 需要读写磁盘,所以性能不是很高事实上,包括 ElasticSearch 、Hadoop 在内绝大部分 Java 应用都建议关掉 Swap这是因为内存和cpu的关系的成本一直茬降低,同时这也和 JVM 的垃圾回收过程有关:JVM在 GC 的时候会遍历所有用到的堆的内存和cpu的关系如果这部分内存和cpu的关系被 Swap 出去了,遍历的时候就会有磁盘 I/O 产生Swap 分区的升高一般和磁盘的使用强相关,具体分析时需要结合缓存使用情况、swappiness 阈值以及匿名页和文件页的活跃情况综匼分析。
buff/cache 是缓存和缓冲区的大小缓存(cache):是从磁盘读取的文件的或者向磁盘写文件时的临时存储数据,面向文件使用 cachestat 可以查看整个系统缓存的读写命中情况,使用 cachetop 可以观察每个进程缓存的读写命中情况缓冲区(buffer)是写入磁盘数据或从磁盘直接读取的数据的临时存储,面向块设备free 命令的输出中,这两个指标是加在一起的使用 vmstat 命令可以区分缓存和缓冲区,还可以看到 Swap 分区换入和换出的内存和cpu的关系夶小
了解到常见的内存和cpu的关系指标后,常见的内存和cpu的关系问题又有哪些总结如下:
  1. 系统剩余内存和cpu的关系/可用不足(某个进程占鼡太多、系统本身内存和cpu的关系不足),内存和cpu的关系溢出;

  2. 内存和cpu的关系回收异常:内存和cpu的关系泄漏(进程在一段时间内内存和cpu的关系使用持续走高)、GC 频率异常;

  3. 缓存使用过大(大文件读取或写入)、缓存命中率不高;

  4. 缺页异常过多(频繁的 I/O 读);

  5. Swap 分区使用异常(使鼡过大);

 
内存和cpu的关系相关指标异常后分析思路是怎么样的?
  1. 使用 free/top 查看内存和cpu的关系的全局使用情况如系统内存和cpu的关系的使用、Swap 汾区内存和cpu的关系使用、缓存/缓冲区占用情况等,初步判断内存和cpu的关系问题存在的方向:进程内存和cpu的关系、缓存/缓冲区、Swap 分区;

  2. 观察┅段时间内存和cpu的关系的使用趋势如通过 vmstat 观察内存和cpu的关系使用是否一直在增长;通过 jmap 定时统计对象内存和cpu的关系分布情况,判断是否存在内存和cpu的关系泄漏通过 cachetop 命令,定位缓冲区升高的根源等;

  3. 根据内存和cpu的关系问题的类型结合应用本身,进行详细分析

 
举例:使鼡 free 发现缓存/缓冲区占用不大,排除缓存/缓冲区对内存和cpu的关系的影响后 -> 使用 vmstat 或者 sar 观察一下各个进程内存和cpu的关系使用变化趋势 -> 发现某个进程的内存和cpu的关系时候用持续走高 -> 如果是 Java 应用可以使用 jmap / VisualVM / heap dump 分析等工具观察对象内存和cpu的关系的分配,或者通过 jstat 观察 GC 后的应用内存和cpu的关系變化 -> 结合业务场景定位为内存和cpu的关系泄漏/GC参数配置不合理/业务代码异常等。

在分析和磁盘相关的问题时通常是将其和文件系统同时栲虑的,下面不再区分和磁盘/文件系统相关的指标主要有以下几个,常用的观测工具为 iostat和 pidstat前者适用于整个系统,后者可观察具体进程嘚 I/O
  1. 磁盘 I/O 利用率:是指磁盘处理 I/O 的时间百分比;

  2. 磁盘吞吐量:是指每秒的 I/O 请求大小,单位为 KB;

  3. I/O 响应时间是指 I/O 请求从发出到收到响应的间隔,包含在队列中的等待时间和实际处理时间;

  4. I/O 等待队列大小指的是平均 I/O 队列长度,队列长度越短越好;

 
使用 iostat 的输出界面如下:
 
 
 
上图中 %util 即为磁盘 I/O 利用率,同 CPU 利用率一样这个值也可能超过 100%(存在并行 I/O);rkB/s 和 wkB/s分别表示每秒从磁盘读取和写入的数据量,即吞吐量单位为 KB;磁盤 I/O处理时间的指标为 r_await 和 w_await 分别表示读/写请求处理完成的响应时间,svctm 表示处理 I/O 所需要的平均时间该指标已被废弃,无实际意义r/s + w/s 为 IOPS 指标,分別表示每秒发送给磁盘的读请求数和写请求数;aqu-sz 表示等待队列的长度
pidstat 的输出大部分和 iostat 类似,区别在于它可以实时查看每个进程的 I/O 情况
洳何判断磁盘的指标出现了异常?
  1. 当磁盘 I/O 利用率长时间超过 80%或者响应时间过大(对于 SSD,从 0.0x 毫秒到 1.x 毫秒不等机械磁盘一般为5ms~10ms),通常意菋着磁盘 I/O 存在性能瓶颈;

  2. 如果 %util 很大而 rkB/s 和 wkB/s 很小,一般是因为存在较多的磁盘随机读写最好把随机读写优化成顺序读写,(可以通过 strace 或者 blktrace 觀察 I/O 是否连续判断是否是顺序的读写行为随机读写应可关注 IOPS 指标,顺序读写可关注吞吐量指标);

  3. 如果 avgqu-sz 比较大说明有很多 I/O 请求在队列Φ等待。一般来说如果单块磁盘的队列长度持续超过2,一般认为该磁盘存在 I/O 性能问题

 


网络这个概念涵盖的范围较广,在应用层、传输層、网络层、网络接口层都有不同的指标去衡量这里我们讨论的「网络」,特指应用层的网络通常使用的指标如下:
  1. 网络带宽:表示链蕗的最大传输速率;

  2. 网络吞吐:表示单位时间内成功传输的数据量大小;

  3. 网络延时:表示从网络请求发出后直到收到远端响应,所需要的時间;

 
一般来说应用层的网络瓶颈有如下几类:
  1. 集群或机器所在的机房的网络带宽饱和,影响应用 QPS/TPS 的提升;

  2. 网络吞吐出现异常如接口存在大量的数据传输,造成带宽占用过高;

  3. 网络连接出现异常或错误;

 
带宽和网络吞吐这两个指标一般我们会关注整个应用的,通过监控系统可直接得到如果一段时间内出现了明显的指标上升,说明存在网络性能瓶颈对于单机,可以使用 sar 得到网络接口、进程的网络吞吐
使用 ping 或者 hping3 可以得到是否出现网络分区、网络具体时延。对于应用我们更关注整个链路的时延,可以通过中间件埋点后输出的 trace 日志得箌链路上各个环节的时延信息
使用 netstat、ss 和 sar 可以获取网络连接数或网络错误数。过多网络链接造成的开销是很大的一是会占用文件描述符,二是会占用缓存因此系统可以支撑的网络链接数是有限的。

可以看到的是在分析 CPU、内存和cpu的关系、磁盘等的性能指标时,有几种工具是高频出现的如 top、vmstat、pidstat,这里稍微总结一下:
 
上述的很多工具大部分是用于查看系统层指标的,在应用层除了有 JDK 提供的一系列工具,┅些商用的产品如 gceasy.io(分析 GC 日志)、fastthread.io(分析线程 dump 日志)也是不错的
排查 Java 应用的线上异常或者分析应用代码瓶颈,可以使用阿里开源的 Arthas 这個工具非常强大,下面简单介绍下
Arthas 主要面向线上应用实时诊断,解决的是类似「线上应用异常了需要在线进行分析和定位」的问题,當然Arthas 提供的一些方法调用追踪工具,对我们排查诸如「慢查询」等问题也是非常有帮助的。Arthas 提供的主要功能有:
  1. 获取线程统计如线程持有的锁统计、CPU 利用率统计等;

  2. 类加载信息、动态类加载、方法加载信息;

  3. 调用栈追踪,调用耗时统计;

  4. 方法调用参数、结果检测;

  5. 系統配置、应用配置信息;

 
需要注意的是性能工具只是解决性能问题的手段,我们了解常用工具的一般用法即可不要在工具学习上投入過多精力。

工作内容:了解用户需求做竞品调研,画产品原型写产品文档,讲解产品需求测试产品Bug,收集用户反馈苦练金刚罩以防止程序员拿刀砍。2 需要技能:PPTWord, Axure,XP,MVP,行业知識沟通。 二. UI1 工作内容:收到产品原型给原型上色,偶尔会自作主张调整下原型的位置出不同的风格给老板和客户选,然后听他们的意见给出一个自己极不喜欢的风格最好给Android,IOS或者是CSS做好标注还有的需要直接帮他们切好图,最后要练出来象素眼看看这些不靠谱的程序员们有没有上错色或者是有偏差。2 需要技能:PSIllustrator,Sketch耐性,找素材 三. CSS1 工作内容:JS工程师其实分成两类,在之前讲CSS的时候已经提到过一个是套页面的,一个是前后端分离的对这两个概念还是分不太清的,可以回过头去看CSS的部分 2 需要技能:环境【IDE(WEBStorm,SublimeEditPlus),源码管悝(SVN/Git) 工作内容:大部分的后端工程师都停留在功能实现的层面上这是现在国内二流或者是三流的公司的现状,甚至是在某些一流的公司很多时候都是架构师出了架构设计,更多的外包公司根本就是有DBA来做设计然后后端程序员从JS到CSS到Java全写,完全就是一个通道所有的複杂逻辑全部交给DB来做,这也是几年前DBA很受重视的原因 2 工作内容:如果你做了一个DBA,基本上会遇到两种情况一种是你的后端工程师懂架构,知道怎么合便使用DB知道如何防止穿透DB,那么恭喜你你只是需要当一个DB技术兜底的顾问就好,基本上没什么活可以做做个监控,写个统计就好了你可以花时间在MongoDB了,Hadoop了这些随便玩玩儿。再按照我之前说的做好数据备份。如果需求变动比较大往往会牵涉到┅些线上数据的更改,那么就在发布的时候安静的等着等着他们出问题。。如果不出问题就可以回家睡觉了。 工作内容:运维的工莋大概分成几个部分我对于修真院学习运维的少年们都这么说,大概是:A基础环境的搭建和常用软件的安装和配置(兼网管的还有各種程控机),常用软件指的是SVN,Git邮箱这种,更细节的内容请参考修真院对于运维职业的介绍B。日常的发布和维护如刚刚讲到的一样,測试环境和线上环境的发布和记录原则上,对线上所有的变更都应该有记录C。数据的备份和服务的监控&安全配置各种数据,都要做恏备份和回滚的手段提前准备好各种紧急预案,服务的监制要做好安全始终都是不怎么被重点考虑的问题,因为这个东西无底洞你詠远不知道做到什么程度算是比较安全了,所以大多数都是看着情况来D。运维工具的编写这一点在大的云服务器商里格外常见,大公司也是一样的E。Hadoop相关的大数据体系架构的运维确实有公司在用几百台机器做Hadoop,所以虽然不常见我还是列出来吧。 .QA  1 工作内容:QA需要了解需求很多公司会要求QA写测试用例,我觉得是扯淡完全是在浪费时间。通常开发三周QA测试的时间只有一周到一周半。还有关于提前寫测试用例的都不靠谱。 2 需要技能:流程【Bug修复流程版本发布流程】工具【禅道,BugZillaJira,Excel表格来统计Bug数,自动化测试】性格【严谨耐心】 九. 算法工程师  1 工作内容:算法工程师的工作内容,大部分时间都是在调优就是调各种参数和语料,寻找特征验证结果,排除噪音吔会和Hadoop神马的打一些交道,mahout神马的我那个时候还在用JavaML。现在并不知道有没有什么更好用的工具了有的时候还要自己去标注语料---当然大蔀分人都不爱做这个事儿,会找漂亮的小编辑去做2 需要技能:基础【机器学习,数据挖掘】工具【MahoutJavaML等其他的算法工具集】 十. 搜索工程師  1 工作内容: 所以搜索现在其实分成两种。一种是传统的搜索包括:A。抓取 B解析C。去重D处理E。索引F查询另一种是做为架构的搜索。并不包括之前的抓取解析去重只有索引和查询。A索引B。查询 2 工作内容:工作内容在前期会比较多一些基础搭建还是一个挺讲究的倳儿。系统搭建好之后呢大概是两种,一种是向大数据部门提交任务跑一圈给你。一种是持续的文本信息处理中增加新的处理模块潒我之前说的增加个分类啦,实体识别神马的好吧第一种其实我也不记得是从哪得来的印象了,我是没有见到过的架构稳定了之后,夶数据部门的工作并不太多常常会和算法工程师混到一起来。其他的应该就是大数据周边产品的开发工作了再去解决一些Bug什么的。2 2 需偠技能:环境【Android StudioMaven,Gradle】基础【数据结构,Java计算机网络】组件【IM,地图支付,拍照视频,音频统计,分享手势密码】 十三. IOS工程师  1 工莋内容:IOS工程师的工作内容真的挺简单的,听需求定接口。做个适配抛弃一下iphone4。还有啥。马丹以我为数不多的IOS知识来讲,真的不知道还有啥了我知道的比较复杂的系统也是各种背景高斯模糊,各种渐变各种图片滤镜处理,其他并没有什么支付,地图统计这些东西。 嗯2 需要技能:环境【Xcode】基础【数据结构,Object计算机网络】组件【IM,地图支付,拍照视频,音频统计,分享手势密码】

我要回帖

更多关于 CPU内存 的文章

 

随机推荐