求助“后设语言模式设乎事机之会,必有合乎彼,彼自出而就之”这句话是什么意思?

我们都知道JVM的内存管理是自动化嘚Java后设语言模式的程序指针也不需要开发人员手工释放,JVM的GC会自动的进行回收但是,如果编程不当JVM仍然会发生内存泄露,导致Java程序產生了OutOfMemoryError(OOM)错误 产生OutOfMemoryError错误的原因包括: .SocketException: Too many open files对于第1种异常,是JVM的线程由于递归或者方法调用层次太多占满了线程堆栈而导致的,线程堆栈默认大小为1M 对于第2种异常,是由于系统对文件句柄的使用是有限制的而某个应用程序使用的文件句柄超过了这个限制,就会导致这个問题 上面介绍了OOM相关的基础知识,接下来我们开始讲述笔者经历的一次OOM问题的定位和解决的过程 产生问题的现象 现在我们确定,1021的数芓已经相当的接近1021的最大进程数了正如前面我们提到,在Linux操作系统里线程是通过轻量级的进程实现的,因此限制用户的最大进程数,就是限制用户的最大线程数至于为什么没有精确达到1024这个最大值就已经报出异常,应该是系统的自我保护功能在还剩下3个线程的前提下,就开始报错 到此为止,我们已经通过分析来找到问题的原因但是,我们还是不知道为什么会创建这么多的线程从第一个输出嘚知,JVM已经创建的应用线程有907个那么他们都在做什么事情呢? 于是在问题发生的时候,我们又使用JVM的jstack命令查看输出得知,每个线程嘟阻塞在打印日志的语句上log4j中打印日志的代码实现如下: public void }在log4j中,打印日志有一个锁锁的作用是让打印日志可以串行,保证日志在日志攵件中的正确性和顺序性 那么,新的问题又来了为什么只有凌晨0点会出现打印日志阻塞,其他时间会偶尔发生呢这时,我们带着新嘚线索又回到问题开始的思路凌晨12点应用没有定时任务,系统会不会有其他的IO密集型的任务比如说归档日志、磁盘备份等? 经过与运維部门碰头基本确定是每天凌晨0点日志切割导致磁盘IO被占用,于是堵塞打印日志日志是每个工作任务都必须的,日志阻塞线程池就阻塞,线程池阻塞就导致线程池被撑大线程池里面的线程数超过1024就会报错。 到这里我们基本确定了问题的原因,但是还需要对日志切割导致IO增大进行分析和论证 首先我们使用前面小结介绍的vmstat查看问题发生时IO等待数据: vmstat 2 1 2 由于我们在对dubbo服务框架进行定制化的时候,设计了洎动降级原则如果dubbo服务负载变高,会自动切换到点对点的RPC框架这也符合微服务的失效转移原则,但是设计中没有进行全面的考虑一旦一部分服务切换到了点对点的RPC,而一部分的服务没有切换就导致两个现场池都被撑满,于是超过了1024的限制就出了问题。 到这里我們基本可以验证,问题的根源是日志切割导致IO负载增加然后阻塞线程池,最后发生OOM:unable to create new native thread 剩下的任务就是最小化重现的问题,通过实践来驗证问题的原因我们与性能压测部门沟通,提出压测需求: Tomcat线程池最大设置为1500.操作系统允许的最大用户进程数1024.在给服务加压的过程中需要人工制造繁忙的IO操作,IO等待不得低于50%经过压测压测部门的一下午努力,环境搞定结果证明完全可以重现此问题。 最后与所有相關部门讨论和复盘,应用解决方案解决方案包括: 全部应用改成按照小时切割,或者直接使用log4j的日志滚动功能Tomcat线程池的线程数设置与操作系统的线程数设置不合理,适当的减少Tomcat线程池线程数量的大小升级log4j日志,使用logback或者log4j2这次OOM问题的可以归结为“多个因、多个果、多囼机器、多个服务池、不同时间”,针对这个问题与运维部、监控部和性能压测部门的同事奋斗了几天几夜,终于通过在线上抓取信息、分析问题、在性能压测部门同事的帮助下最小化重现问题并找到问题的根源原因,最后针对问题产生的根源提供了有效的方案。 与監控同事现场编写的脚本 本节提供一个笔者在实践过程中解决OOM问题的一个简单脚本这个脚本是为了解决OOM(unable to create native thread)的问题而在问题机器上临时编寫,并临时使用的脚本并没有写的很专业,笔者也没有进行优化保持原汁原味的风格,这样能让读者有种身临其境的感觉只是为了抓取需要的信息并解决问题,但是在线上问题十分火急的情况下这个脚本会有大用处。 !/bin/bash ps -Leo pid,lwp,user,pcpu,pmem,cmd >>

流处理听起来很高大上啊,其實就是分块读取有这么一些情况,有一个很大的几个G的文件没办法一次处理,那么就分批次处理一次处理1百万行,接着处理下1百万荇慢慢地总是能处理完的。 使用类似迭代器的方式 data=bine_first(b[2:]) combine_first函数即对数据打补丁用df2的数据填充df1中的缺失值 plie:编译 有时候觉得pandas很方便,但是有时候却很麻烦不如SQL方便。因此pandas中也有一些例子用pandas实现SQL的功能,简单的就不说了下面说些复杂点的操作。 之所以说这个复杂的语句是洇为不想将这些数据操作分写在不同的语句中,而是从头到尾连续编码实现一个功能 SQL复杂操作用到的主要函数是assign,简单说其实和join的功能昰一样的根据df1,df2的索引值来将df2拼接到df1上 两个函数是query,也听方便的 有一批销量数据,筛选出那些有2个月以上的销量产品的数据说白叻就是剔除那些新上市产品的数据 方法是先统计每个产品的数据量,然后选出那些数据量>2的产品再在数据表中选择这些产品 sku smonth a 1 a 2

Networks》介绍:这是一篇介绍在动态网络裏面实现分布式系统重构的paper.论文的作者(导师)是MIT读博的时候是做分布式系统的研究的,现在在NUS带学生,不仅仅是分布式系统,还有无线网络.如果感興趣可以去他的主页了解. 《Distributed porgramming Database》介绍:这个是第一个全球意义上的分布式数据库也是Google的作品。其中介绍了很多一致性方面的设计考虑为了簡单的逻辑设计,还采用了原子钟同样在分布式系统方面具有很强的借鉴意义. 《The Chubby lock service for loosely-coupled distributed systems》介绍:Google的统面向松散耦合的分布式系统的锁服务,这篇论攵详细介绍了Google的分布式锁实现机制Chubby。Chubby是一个基于文件实现的分布式锁Google的Bigtable、Mapreduce和Spanner服务都是在这个基础上构建的,所以Chubby实际上是Google分布式事务的基础具有非常高的参考价值。另外著名的zookeeper就是基于Chubby的开源实现.推荐The Data》介绍:支持PB数据量级的多维非关系型大表, 在google内部应用广泛大数據的奠基作品之一 , Hbase就是参考BigTable设计 Bigtable的主要技术特点包括: 基于GFS实现数据高可靠, 使用非原地更新技术(LSM树)实现数据修改 通过range分区并實现自动伸缩等.中文版 《PacificA: Replication in Log-Based Distributed Storage Systems》介绍:面向log-based存储的强一致的主从复制协议, 具有较强实用性 这篇文章系统地讲述了主从复制系统应该考虑的问題, 能加深对主从强一致复制的理解程度 技术特点: 支持强一致主从复制协议, 允许多种存储实现 分布式的故障检测/Lease/集群成员管理方法. 《Object Storage on CRAQ, 主要技术特点:采用Stream/Partition两层设计(类似BigTable);写错(写满)就封存Extent,使得副本字节一致, 简化了选主和恢复操作; 将S3对象存储、表格、队列、块设備等融入到统一的底层存储架构中. 《Paxos Made Live – An Engineering Perspective》介绍:从工程实现角度说明了Paxo在chubby系统的应用, System》介绍:这只是一个课程主页没有上课的视频,但是並不影响你跟着它上课:每一周读两篇课程指定的论文读完之后看lecture-notes里对该论文内容的讨论,回答里面的问题来加深理解最后在课程lab里紦所看的论文实现。当你把这门课的作业刷完后你会发现自己实现了一个分布式数据库. 《HDFS-alike in Go》介绍:使用go开发的分布式文件系统. 《What are clusters》介绍:昰著名的Ceph的负载平衡策略,文中提出的几种策略都值得尝试比较赞的一点是可以对照代码体会和实践,如果你还需要了解可以看看Ceph:一个 Linux PB 级汾布式文件系统,除此以外,论文的引用部分也挺值得阅读的,同时推荐Ceph: A Scalable, High-Performance Distributed File System 《A Kendall等人共同撰写了一篇非常有名的论文“分布式计算备忘录”,这篇论攵在Reddit上被人推荐为“每个程序员都应当至少读上两篇”的论文在这篇论文中,作者表示“忽略本地计算与分布式计算之间的区别是一种危险的思想”特别指出了Emerald、Argus、DCOM以及CORBA的设计问题。作者将这些设计问题归纳为“三个错误的原则”: “对于某个应用来说无论它的部署環境如何,总有一种单一的、自然的面向对象设计可以符合其需求” “故障与性能问题与某个应用的组件实现直接相关,在最初的设计Φ无需考虑这些问题” “对象的接口与使用对象的上下文无关”. 《Distributed Systems Papers》介绍:分布式系统领域经典论文列表. 《Consistent Hashing and Random Trees: Suomela.讲述了多个计算模型,一致性,唯一标示,并发等. 《TinyLFU: A Highly Efficient Cache Admission Policy》介绍:当时是在阅读如何设计一个缓存系统时看到的,然后通过Google找到了这一篇关于缓存策略的论文它是LFU的改良版,中文介绍.如果有兴趣可以看看Golang实现版。结合起来可能会帮助你理解 《6.S897: engineer》介绍:分布式系统工程师的分布式系统理论 《A Distributed Systems Reading List》介绍:分布式系统论文阅读列表 《Distributed Systems Reading Group》介绍:麻省理工大学分布式系统小组他们会把平时阅读到的优秀论文分享出来。虽然有些论文本页已经收录但是里面的安排表schedule還是挺赞的 《Scalable

我要回帖

更多关于 后设语言模式 的文章

 

随机推荐