当前位置: 首页 > news >正文

外国网站 dns解析失败网站备案填写要求

外国网站 dns解析失败,网站备案填写要求,昆明今天刚刚发生的新闻,后台网站要做权限前端还是后台做阅读本文大概需要 10 分钟。作者#xff1a;张俊城, 郭理勇, 刘建来源#xff1a;http://t.cn/AiCTERJzJava 应用性能优化是一个老生常谈的话题#xff0c;典型的性能问题如页面响应慢、接口超时#xff0c;服务器负载高、并发数低#xff0c;数据库频繁死锁等。尤其是在“… 阅读本文大概需要 10 分钟。作者张俊城, 郭理勇, 刘建来源http://t.cn/AiCTERJzJava 应用性能优化是一个老生常谈的话题典型的性能问题如页面响应慢、接口超时服务器负载高、并发数低数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天随着系统访问量的日益增加和代码的臃肿各种性能问题开始纷至沓来。Java 应用性能的瓶颈点非常多比如磁盘、内存、网络 I/O 等系统因素Java 应用代码JVM GC数据库缓存等。笔者根据个人经验将 Java 性能优化分为 4 个层级应用层、数据库层、框架层、JVM 层如图 1 所示。图 1.Java 性能优化分层模型每层优化难度逐级增加涉及的知识和解决的问题也会不同。比如应用层需要理解代码逻辑通过 Java 线程栈定位有问题代码行等数据库层面需要分析 SQL、定位死锁等框架层需要懂源代码理解框架机制JVM 层需要对 GC 的类型和工作机制有深入了解对各种 JVM 参数作用了然于胸。围绕 Java 性能优化有两种最基本的分析方法现场分析法和事后分析法。现场分析法通过保留现场再采用诊断工具分析定位。现场分析对线上影响较大部分场景特别是涉及到用户关键的在线业务时不太合适。事后分析法需要尽可能多收集现场数据然后立即恢复服务同时针对收集的现场数据进行事后分析和复现。下面我们从性能诊断工具出发分享一些案例与实践。1 性能诊断工具性能诊断一种是针对已经确定有性能问题的系统和代码进行诊断还有一种是对预上线系统提前性能测试确定性能是否符合上线要求。本文主要针对前者后者可以用各种性能压测工具例如 JMeter进行测试不在本文讨论范围内。针对 Java 应用性能诊断工具主要分为两层OS 层面和 Java 应用层面包括应用代码诊断和 GC 诊断。OS 的诊断主要关注的是 CPU、Memory、I/O 三个方面。2 CPU 诊断对于 CPU 主要关注平均负载Load AverageCPU 使用率上下文切换次数Context Switch。通过 top 命令可以查看系统平均负载和 CPU 使用率图 2 为通过 top 命令查看某系统的状态。图 2.top 命令示例平均负载有三个数字63.6658.3957.18分别表示过去 1 分钟、5 分钟、15 分钟机器的负载。按照经验若数值小于 0.7*CPU 个数则系统工作正常若超过这个值甚至达到 CPU 核数的四五倍则系统的负载就明显偏高。图 2 中 15 分钟负载已经高达 57.181 分钟负载是 63.66系统为 16 核说明系统出现负载问题且存在进一步升高趋势需要定位具体原因了。通过 vmstat 命令可以查看 CPU 的上下文切换次数如图 3 所示图 3.vmstat 命令示例上下文切换次数发生的场景主要有如下几种1时间片用完CPU 正常调度下一个任务2被其它优先级更高的任务抢占3执行任务碰到 I/O 阻塞挂起当前任务切换到下一个任务4用户代码主动挂起当前任务让出 CPU5多任务抢占资源由于没有抢到被挂起6硬件中断。Java 线程上下文切换主要来自共享资源的竞争。一般单个对象加锁很少成为系统瓶颈除非锁粒度过大。但在一个访问频度高对多个对象连续加锁的代码块中就可能出现大量上下文切换成为系统瓶颈。比如在我们系统中就曾出现 log4j 1.x 在较大并发下大量打印日志出现频繁上下文切换大量线程阻塞导致系统吞吐量大降的情况其相关代码如清单 1 所示升级到 log4j 2.x 才解决这个问题。for(Category c  this; c ! null; cc.parent) { // Protected against simultaneous call to addAppender, removeAppender,… synchronized(c) { if (c.aai ! null) { write  c.aai.appendLoopAppenders(event); } … }}3 Memory从操作系统角度内存关注应用进程是否足够可以使用 free –m 命令查看内存的使用情况。通过 top 命令可以查看进程使用的虚拟内存 VIRT 和物理内存 RES根据公式 VIRT SWAP RES 可以推算出具体应用使用的交换分区Swap情况使用交换分区过大会影响 Java 应用性能可以将 swappiness 值调到尽可能小。因为对于 Java 应用来说占用太多交换分区可能会影响性能毕竟磁盘性能比内存慢太多。4 I/OI/O 包括磁盘 I/O 和网络 I/O一般情况下磁盘更容易出现 I/O 瓶颈。通过 iostat 可以查看磁盘的读写情况通过 CPU 的 I/O wait 可以看出磁盘 I/O 是否正常。如果磁盘 I/O 一直处于很高的状态说明磁盘太慢或故障成为了性能瓶颈需要进行应用优化或者磁盘更换。除了常用的 top、 ps、vmstat、iostat 等命令还有其他 Linux 工具可以诊断系统问题如 mpstat、tcpdump、netstat、pidstat、sar 等。Brendan 总结列出了 Linux 不同设备类型的性能诊断工具如图 4 所示可供参考。图 4.Linux 性能观测工具5 Java 应用诊断及工具应用代码性能问题是相对好解决的一类性能问题。通过一些应用层面监控报警如果确定有问题的功能和代码直接通过代码就可以定位或者通过 topjstack找出有问题的线程栈定位到问题线程的代码上也可以发现问题。对于更复杂逻辑更多的代码段通过 Stopwatch 打印性能日志往往也可以定位大多数应用代码性能问题。常用的 Java 应用诊断包括线程、堆栈、GC 等方面的诊断。jstackjstack 命令通常配合 top 使用通过 top -H -p pid 定位 Java 进程和线程再利用 jstack -l pid 导出线程栈。由于线程栈是瞬态的因此需要多次 dump一般 3 次 dump一般每次隔 5s 就行。将 top 定位的 Java 线程 pid 转成 16 进制得到 Java 线程栈中的 nid可以找到对应的问题线程栈。图 5. 通过 top –H -p 查看运行时间较长 Java 线程如图 5 所示其中的线程 24985 运行时间较长可能存在问题转成 16 进制后通过 Java 线程栈找到对应线程 0x6199 的栈如下从而定位问题点如图 6 所示。图 6.jstack 查看线程堆栈JProfilerJProfiler 可对 CPU、堆、内存进行分析功能强大如图 7 所示。同时结合压测工具可以对代码耗时采样统计。图 7. 通过 JProfiler 进行内存分析6 GC 诊断Java GC 解决了程序员管理内存的风险但 GC 引起的应用暂停成了另一个需要解决的问题。JDK 提供了一系列工具来定位 GC 问题比较常用的有 jstat、jmap还有第三方工具 MAT 等。jstatjstat 命令可打印 GC 详细信息Young GC 和 Full GC 次数堆信息等。其命令格式为jstat –gcxxx -t pid interval count如图 8 所示。图 8.jstat 命令示例jmapjmap 打印 Java 进程堆信息 jmap –heap pid。通过 jmap –dump:filexxx pid 可 dump 堆到文件然后通过其它工具进一步分析其堆使用情况。MATMAT 是 Java 堆的分析利器提供了直观的诊断报告内置的 OQL 允许对堆进行类 SQL 查询功能强大outgoing reference 和 incoming reference 可以对对象引用追根溯源。图 9.MAT 示例图 9 是 MAT 使用示例MAT 有两列显示对象大小分别是 Shallow size 和 Retained size。前者表示对象本身占用内存的大小不包含其引用的对象。后者是对象自己及其直接或间接引用的对象的 Shallow size 之和即该对象被回收后 GC 释放的内存大小一般说来关注后者大小即可。对于有些大堆 (几十 G) 的 Java 应用需要较大内存才能打开 MAT。通常本地开发机内存过小是无法打开的建议在线下服务器端安装图形环境和 MAT远程打开查看。或者执行 mat 命令生成堆索引拷贝索引到本地不过这种方式看到的堆信息有限。为了诊断 GC 问题建议在 JVM 参数中加上-XX:PrintGCDateStamps。常用的 GC 参数如图 10 所示。图 10. 常用 GC 参数对于 Java 应用通过 topjstackjmapMAT 可以定位大多数应用和内存问题可谓必备工具。有些时候Java 应用诊断需要参考 OS 相关信息可使用一些更全面的诊断工具比如 Zabbix整合了 OS 和 JVM 监控等。在分布式环境中分布式跟踪系统等基础设施也对应用性能诊断提供了有力支持。7 性能优化实践在介绍了一些常用的性能诊断工具后下面将结合我们在 Java 应用调优中的一些实践从 JVM 层、应用代码层以及数据库层进行案例分享。JVM 调优GC 之痛XX商业平台某系统重构时选择 RMI 作为内部远程调用协议系统上线后开始出现周期性的服务停止响应暂停时间由数秒到数十秒不等。通过观察 GC 日志发现服务自启动后每小时会出现一次 Full GC。由于系统堆设置较大Full GC 一次暂停应用时间会较长这对线上实时服务影响较大。经过分析在重构前系统没有出现定期 Full GC 的情况因此怀疑是 RMI 框架层面的问题。通过公开资料发现 RMI 的 GDCDistributed Garbage Collection分布式垃圾收集会启动守护线程定期执行 Full GC 来回收远程对象清单 2 中展示了其守护线程代码。清单 2.DGC 守护线程源代码private static class Daemon extends Thread { public void run() { for (;;) {      //… long d  maxObjectInspectionAge(); if (d  l) {    System.gc();  d  0; } //… }     }}定位问题后解决起来就比较容易了。一种是通过增加-XX:DisableExplicitGC 参数直接禁用系统 GC 的显示调用但对使用 NIO 的系统会有堆外内存溢出的风险。另一种方式是通过调大 -Dsun.rmi.dgc.server.gcInterval 和-Dsun.rmi.dgc.client.gcInterval 参数增加 Full GC 间隔同时增加参数-XX:ExplicitGCInvokesConcurrent。将一次完全 Stop-The-World 的 Full GC 调整为一次并发 GC 周期减少应用暂停时间同时对 NIO 应用也不会造成影响。从图 11 可知调整之后的 Full GC 次数 在 3 月之后明显减少。图 11.Full GC 监控统计GC 调优对高并发大数据量交互的应用还是很有必要的尤其是默认 JVM 参数通常不满足业务需求需要进行专门调优。GC 日志的解读有很多公开的资料本文不再赘述。GC 调优目标基本有三个思路降低 GC 频率可以通过增大堆空间减少不必要对象生成降低 GC 暂停时间可以通过减少堆空间使用 CMS GC 算法实现避免 Full GC调整 CMS 触发比例避免 Promotion Failure 和 Concurrent mode failure老年代分配更多空间增加 GC 线程数加快回收速度减少大对象生成等。应用层调优嗅到代码的坏味道从应用层代码调优入手剖析代码效率下降的根源无疑是提高 Java 应用性能的很好的手段之一。某商业广告系统采用 Nginx 进行负载均衡某次日常上线后其中有几台机器负载急剧升高CPU 使用率迅速打满。我们对线上进行了紧急回滚并通过 jmap 和 jstack 对其中某台服务器的现场进行保存。图 12. 通过 MAT 分析堆栈现场堆栈现场如图 12 所示根据 MAT 对 dump 数据的分析发现最多的内存对象为 byte[] 和 java.util.HashMap $Entry且 java.util.HashMap $Entry 对象存在循环引用。初步定位在该 HashMap 的 put 过程中有可能出现了死循环问题图中 java.util.HashMap $Entry 0x2add6d992cb8 和 0x2add6d992ce8 的 next 引用形成循环。查阅相关文档定位这属于典型的并发使用的场景错误 (http://bugs.java.com/bugdatabase/view_bug.do?bug_id6423457) 。简要的说就是 HashMap 本身并不具备多线程并发的特性在多个线程同时 put 操作的情况下内部数组进行扩容时会导致 HashMap 的内部链表形成环形结构从而出现死循环。针对此次上线最大的改动在于通过内存缓存网站数据来提升系统性能同时使用了懒加载机制如清单 3 所示。清单 3. 网站数据懒加载代码private static MapLong, UnionDomain domainMap  new HashMapLong, UnionDomain();    private boolean isResetDomains() {        if (CollectionUtils.isEmpty(domainMap)) {            // 从远端 http 接口获取网站详情            ListUnionDomain newDomains  unionDomainHttpClient                    .queryAllUnionDomain();            if (CollectionUtils.isEmpty(domainMap)) {                domainMap  new HashMapLong, UnionDomain();                for (UnionDomain domain : newDomains) {                    if (domain ! null) {                        domainMap.put(domain.getSubdomainId(), domain);                    }                }            }            return true;        }        return false;    }可以看到此处的 domainMap 为静态共享资源它是 HashMap 类型在多线程情况下会导致其内部链表形成环形结构出现死循环。通过对前端 Nginx 的连接和访问日志可以看到由于在系统重启后 Nginx 积攒了大量的用户请求在 Resin 容器启动大量用户请求涌入应用系统多个用户同时进行网站数据的请求和初始化工作导致 HashMap 出现并发问题。在定位故障原因后解决方法则比较简单主要的解决方法有1采用 ConcurrentHashMap 或者同步块的方式解决上述并发问题;2在系统启动前完成网站缓存加载去除懒加载等3采用分布式缓存替换本地缓存等。对于坏代码的定位除了常规意义上的代码审查外借助诸如 MAT 之类的工具也可以在一定程度对系统性能瓶颈点进行快速定位。但是一些与特定场景绑定或者业务数据绑定的情况却需要辅助代码走查、性能检测工具、数据模拟甚至线上引流等方式才能最终确认性能问题的出处。以下是我们总结的一些坏代码可能的一些特征供大家参考1代码可读性差无基本编程规范2对象生成过多或生成大对象内存泄露等3IO 流操作过多或者忘记关闭4数据库操作过多事务过长;5同步使用的场景错误;6循环迭代耗时操作等。数据库层调优死锁噩梦对于大部分 Java 应用来说与数据库进行交互的场景非常普遍尤其是 OLTP 这种对于数据一致性要求较高的应用数据库的性能会直接影响到整个应用的性能。搜狗商业平台系统作为广告主的广告发布和投放平台对其物料的实时性和一致性都有极高的要求我们在关系型数据库优化方面也积累了一定的经验。对于广告物料库来说较高的操作频繁度特别是通过批量物料工具操作很极易造成数据库的死锁情况发生其中一个比较典型的场景是广告物料调价。客户往往会频繁的对物料的出价进行调整从而间接给数据库系统造成较大的负载压力也加剧了死锁发生的可能性。下面以搜狗商业平台某广告系统广告物料调价的案例进行说明。某商业广告系统某天访问量突增造成系统负载升高以及数据库频繁死锁死锁语句如图 13 所示。图 13. 死锁语句其中groupdomain 表上索引为 idx_groupdomain_accountid (accountid)idx_groupdomain_groupid(groupid)primary(groupdomainid) 三个单索引结构采用 Mysql innodb 引擎。此场景发生在更新组出价时场景中存在着组、组行业groupindus 表和组网站groupdomain 表。当更新组出价时若组行业出价使用组出价通过 isusegroupprice 标示若为 1 则使用组出价。同时若组网站出价使用组行业出价通过 isuseindusprice 标示若为 1 则使用组行业出价时也需要同时更新其组网站出价。由于每个组下面最大可以有 3000 个网站因此在更新组出价时会长时间的对相关记录进行锁定。从上面发生死锁的问题可以看到事务 1 和事务 2 均选择了 idx_groupdomain_accountid 的单列索引。根据 Mysql innodb 引擎加锁的特点在一次事务中只会选择一个索引使用而且如果一旦使用二级索引进行加锁后会尝试将主键索引进行加锁。进一步分析可知事务 1 在请求事务 2 持有的idx_groupdomain_accountid二级索引加锁加锁范围“space id 5726 page no 8658 n bits 824 index”但是事务 2 已获得该二级索引 (“space id 5726 page no 8658 n bits 824 index”) 上所加的锁在等待请求锁定主键索引 PRIMARY 索引上的锁。由于事务 2 等待执行时间过长或长时间不释放锁导致事务 1 最终发生回滚。通过对当天访问日志跟踪可以看到当天有客户通过脚本方式发起大量的修改推广组出价的操作导致有大量事务在循环等待前一个事务释放锁定的主键 PRIMARY 索引。该问题的根源实际上在于 Mysql innodb 引擎对于索引利用有限在 Oracle 数据库中此问题并不突出。解决的方式自然是希望单个事务锁定的记录数越少越好这样产生死锁的概率也会大大降低。最终使用了accountid, groupid的复合索引缩小了单个事务锁定的记录条数也实现了不同计划下的推广组数据记录的隔离从而减少该类死锁的发生几率。通常来说对于数据库层的调优我们基本上会从以下几个方面出发1在 SQL 语句层面进行优化慢 SQL 分析、索引分析和调优、事务拆分等2在数据库配置层面进行优化比如字段设计、调整缓存大小、磁盘 I/O 等数据库参数优化、数据碎片整理等3从数据库结构层面进行优化考虑数据库的垂直拆分和水平拆分等4选择合适的数据库引擎或者类型适应不同场景比如考虑引入 NoSQL 等。8 总结与建议性能调优同样遵循 2-8 原则80%的性能问题是由 20%的代码产生的因此优化关键代码事半功倍。同时对性能的优化要做到按需优化过度优化可能引入更多问题。对于 Java 性能优化不仅要理解系统架构、应用代码同样需要关注 JVM 层甚至操作系统底层。总结起来主要可以从以下几点进行考虑1基础性能的调优这里的基础性能指的是硬件层级或者操作系统层级的升级优化比如网络调优操作系统版本升级硬件设备优化等。比如 F5 的使用和 SDD 硬盘的引入包括新版本 Linux 在 NIO 方面的升级都可以极大的促进应用的性能提升2数据库性能优化包括常见的事务拆分索引调优SQL 优化NoSQL 引入等。比如在事务拆分时引入异步化处理最终达到一致性等做法的引入包括在针对具体场景引入的各类 NoSQL 数据库都可以大大缓解传统数据库在高并发下的不足3应用架构优化引入一些新的计算或者存储框架利用新特性解决原有集群计算性能瓶颈等或者引入分布式策略在计算和存储进行水平化包括提前计算预处理等利用典型的空间换时间的做法等都可以在一定程度上降低系统负载4业务层面的优化技术并不是提升系统性能的唯一手段在很多出现性能问题的场景中其实可以看到很大一部分都是因为特殊的业务场景引起的。如果能在业务上进行规避或者调整其实往往是最有效的。·END·程序员的成长之路路虽远行则必至本文原发于 同名微信公众号「程序员的成长之路」回复「1024」你懂得给个赞呗。回复 [ 520 ] 领取程序员最佳学习方式回复 [ 256 ] 查看 Java 程序员成长规划 转载于:https://blog.51cto.com/14057963/2408346
http://www.zqtcl.cn/news/525154/

相关文章:

  • 关于电子商务网站建设的现状企业公示信息查询系统山西
  • 网站开发 翻译长春建站企业
  • dedecms网站网站解析一般什么时候
  • 制作网站的技术北京律师24小时电话
  • 可拖拽 网站建设如何做自媒体和网站签约赚点击
  • 做网站选哪个语言怎么登录百度app
  • 国发网站建设网站优化主要优化哪些地方
  • 快速微信网站开发定制网站建设费用预算
  • 网站制作叫什么知名网站建设制作
  • 网络营销网站建设公司h5应用
  • 网站开发合同要上印花税吗南江红鱼洞水库建设管理局网站
  • 疏通下水道网站怎么做wordpress 恢复初始化
  • 电脑商业网站怎的做软文推广渠道
  • 自己做网站需要买什么如何做微信商城网站
  • 有了网站开发app是不是更容易自建网站管理
  • 网站将要准备建设的内容有哪些做外贸有效的网站
  • 网站设计博客网站内容添加
  • 网站建站行业新闻微盟开店怎么收费
  • 网站的建设参考文献郑州网站建设中国建设建设银行
  • 重庆那些公司的网站是网易做的电信100m光纤做网站
  • 网站怎么设计产品营销策略包括哪些内容
  • 天元建设集团有限公司破产重组河源seo排名
  • 网站权重什么意思seo的搜索排名影响因素有
  • 建设报名系统是正规网站吗计算机培训班出来好找工作吗
  • 网站上的文章用秀米可以做吗宁波外客网络科技有限公司
  • 网站底部导航代码成品视频直播软件推荐哪个好一点ios
  • 上海电商网站开发公司垫江网站建设价格
  • 门户网站建设存在问题与不足商城网站开发项目文档
  • wordpress建站方便吗wordpress加入海报功能
  • 网站名称注册保护2018wordpress主题