Blog of Jeff Xue

  • Home

  • Categories

  • 读书

  • 编程

  • 思考

  • Archives

  • Tags

JVM堆内存配置导致的一次异常

Posted on 2016-08-02 Edited on 2020-01-19 In 性能

问题由来

今天在压测一个接口的情况下,突然发现运行一段时间后,整体性能出现了激剧下降,响应时间出现飙升

如下图中TPS在运行11分钟后出现了一个下降,后续又出现了一个急速的下降,然后再开始恢复的过程
tps
对应的响应时间也出现了响应的变化
trs

查找原因

  • 检查应用日志,没有异常
  • 检查资源情况,没有异常
  • 检查jvm的监视,发现异常
    当时jvisualvm刚好是开启着监控,因此观察到了这次异常,对应是11点25分的看到堆内存从1G突增到了2G,同时CPU也飙升了上去,初步断定JVM在分配内存的时候,会导致应用的性能激剧下降。
    jvm

改进方案

将初始化的堆大小设置为最大的堆大小,在启动时即可将内存分配好,减少这种异常的情况

1
-Xms2048m -Xmx2048m

高性能网站建设进阶指南:Web开发者性能优化最佳指南

Posted on 2016-08-01 Edited on 2020-01-19 In 读书

理解ajax

  • 时间、质量和成本,三选二,一切都是权衡
  • 优化的目的是希望降低程序的整体开销,更应该把重点放在程序整体开销影响最大的那部分
  • ajax的实现方式是:发送数据包到服务端(json),然后服务端返回另一个数据包(json)来响应,最后JavaScript程序使用这些数据来更新浏览器的显示
  • ajax应用常见错误是把所有应用数据都发送给浏览器,这会再次引入ajax本应避免的延迟问题,同事也会增加浏览器需要处理的数据量
  • DOM API非常低效,运行程序最大的开销往往是DOM而非JavaScript,理解DOM的奥秘并减少它的影响比试图给脚本提速效果更好
  • 误用酷炫特性也会导致不必要的DOM操作,从而带来令人吃惊的巨大开销
  • 大部分JavaScript引擎的优化是为了抢占市场而不是性能

创建快速响应的Web应用

浏览器的简单工作原理:当用户和浏览器交互时,操作系统接收到计算机的输入后,打包为单独时间并放置到该应用的事件队列中,浏览器按队列顺序(先进先出)完成其队列中单独时间的处理,然后决定如何处理这个事件。并且这个处理过程实质上是单线程的,任意一个任务都能阻止其他任务的执行(具体细节会有所不同)。

Read more »

聊一聊浏览器缓存

Posted on 2016-07-26 Edited on 2020-01-19 In 前端

先说明下在高性能网站建设指南的14条性能规则中的其中几条:

  • 减少HTTP请求
  • 添加Expires头
  • 禁用/配置Etag头

而这些恰恰就是跟浏览器缓存相关的内容。作为用户访问的最后一英里:浏览器,浏览器缓存对改善用户体验有着很重要的作用

但是浏览器缓存在不同浏览器的操作和首部字段的情况下,都会有不同的表现
简单的抛出几个场景:

  1. 地址栏输出地址后,点击回车,response是200, 304还是 200(from cache)?
  2. 点击浏览器刷新/F5刷新,response是200, 304还是 200(from cache)?
  3. chrome中打开开发者工具的情况下,上面两种场景又是怎么样的情况?

HTTP报文

先来看看与缓存相关的报文首部字段,加粗为现在经常使用到的

通用首部字段

通用首部字段:请求报文和响应报文都会使用的首部

字段名称 说明
Cache-Control 控制缓存的行为
Pragma 报文指令,http1.0的遗留物,值为“no-cache”时禁用缓存
Read more »

如何隐藏你的Linux命令行历史

Posted on 2016-07-25 Edited on 2020-01-19 In 运维

简直就是黑客必备小技能

命令前加空格

首先需要设置环境变量HISCONTROL为ignorespace或者ignoreboth

1
2

export HISTCONTROL=ignorespace

后面在运行命令前加入空格,将不会被记录到系统history中

1
2

Jeff-Mac$ echo $HISTCONTROL

禁止当前会话的所有历史记录

1
2

export HISTSIZE=0

没有东西会记录到历史记录中

Read more »

debian设置程序开机启动

Posted on 2016-07-25 Edited on 2020-01-19 In 运维

方法一:修改rc.local

修改/etc/rc.local,在exit 0之前添加你需要运行的程序,需要注意以下几点:

  • 使用绝对路径,如需要调用node的forever守护进程来启动,需要使用绝对路径/usr/local/node/bin/forever start usr/local/apps/document/ROOT/app.js,不能直接使用forever,具体原因是/etc/init.d/rc.local在调用/etc/rc.local之前修改了PATH,否则会导致你的服务无法启动
  • rc.local是等待对应运行状态的/etc/init.d/服务都开启后才会执行的,因此如果服务未开启完成,rc.local是不会执行的
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    /usr/local/node/bin/forever start /usr/local/apps/document/ROOT/app.js

    exit 0
Read more »

《高性能网站建设指南》

Posted on 2016-07-22 Edited on 2020-01-19 In 读书

14条性能规则

  • 规则1:减少HTTP请求,介绍为什么额外的HTTP请求会对性能产生巨大的影响,并介绍了减少HTTP请求的 方法,包括图片地图,CSS Spries, 使用data:模式的URL内联图片,以及合并脚本和样式表
  • 规则2:使用内容发布网络(CDN),强调使用内容分发网络的优势
  • 规则3:添加Expires头,研究一个简单的HTTP头是如何通过使用浏览器缓存来戏剧性地改善Web页面性能
  • 规则4:压缩组件,解析压缩是如何工作的,以及如何为Web服务器启用压缩,并讨论了现今存在的一些兼容性问题
  • 规则5:将样式表放在顶部,展示脚本是如何影响呈现的
  • 规则6:将脚本放在底部,展示脚本是如何影响呈现的,以及脚本是如何下载到浏览器中的
  • 规则7:避免CSS表达式,讨论CSS表达式的使用和度量其影响的重要性
  • 规则8:使用外部javascript和css,介绍如何权衡内联javascript和css,还是将他们放在外部文件中
  • 规则9:减少DNS查找,强调解析域名是的频繁查找所产生的影响
  • 规则10:精简javascript,量化从javascript中移除空白字符所带来的收益
  • 规则11:避免重定向,使用重定向提出了警示,并给出了可替代的方法
  • 规则12:移除重复脚本,展示如果一个页面中包含了两处相同的脚本会发生什么情况
  • 规则13:配置ETag,介绍ETag是如何工作的,以及为什么对于任何拥有多余一台Web服务器的网站来说,默认的实现都是不好的
  • 规则14: 使Ajax可缓存,强调在使用Ajax时牢记这些性能规则的重要性
Read more »

如何看懂Debian源

Posted on 2016-07-21 Edited on 2020-01-19 In 运维

/etc/apt/source.list

source.list列出了所包含的源,一般情况下采用以下的格式:

1
2
deb http://site.example.com/debian distribution component1 component2 component3
deb-src http://site.example.com/debian distribution component1 component2 component3

deb与deb-src

deb和deb-src代表了不同的源存档类型

  • deb代表预编译好的二进制的包
  • deb-src代表源码包

仓库URL

http://site.example.com/debian 代表仓库的URL,debian的仓库镜像可见mirror list

如果你不知道使用哪个源,可以使用http://httpredir.debian.org/debian,会动态的重定向最合适的源地址

Read more »

《问题解决的系统思考》培训摘录

Posted on 2016-07-10 Edited on 2020-01-19 In 思考

培训日期:2016-07-09~2016-07-10

  • 系统思考是实操性的

  • 执行力往往是系统思考的杀手

  • 组织学习的7项障碍

    • 局限思考(本位主义)
    • 归罪于外(自我中心)
    • 缺乏整体思考的主动性(积极思考不等于积极行动)
    • 专注于个别的事情(单个短期事情充斥着一切)
    • 对缓慢致命危险不敏感(温水煮青蛙的故事)
    • 从经验学习的错觉(走出经验学习的时空误区)
    • 管理团队的迷失(避免“熟练的无能”)
  • 任何问题至少有3种解决问题的方法

  • 相同的做法不会得到不同的结果

  • 预见未来的最好的方法就是创造未来

  • 主动找到市场的突破口

Read more »

《从0到1:开启商业与未来的秘密》

Posted on 2016-07-07 Edited on 2020-01-19 In 读书
  • 在什么重要问题上你与其他人有不同看法?
  • 从小处看,未来只是还没有到来的时刻的集合。但是真正使未来如何独特和重要的并非因为未来没有发生,而是未来的世界会与此刻不同
  • 垂直进步,也称深入进步,意思是要探索新的道路–从0到1的进步。垂直进步较难想象,人们需要尝试从未做过的事
  • 初创公司遵守这样一个原则,你需要和其他人合作来完成工作,但也需要控制规模,使组织有效运转
  • 一个新公司最重要的力量是新思想,新思想甚至比灵活性更重要,而规模小才有思考的空间
  • 最反主流的行动不是抵制潮流,而是在潮流中不丢弃自己的独立思考
  • 非垄断者通过把他们的市场定义成各种更小市场的交集来夸大自己的独特性,相反,垄断者通过把自己市场描述成若干大市场的并集来伪装他们的垄断性
  • 有创意的垄断企业不仅对外界社会没有坏影响,相反,它们是使社会更美好的推动力
Read more »

mysql单机双实例

Posted on 2016-06-12 Edited on 2020-01-19 In 运维

由于后续进行数据库读写分离,需要在开发环境中部署主从数据库,为了节省资源,主从数据库将部署在同一台服务器中,因此针对单机双实例场景配置进行说明。

此处并不对如何安装mysql进行说明,具体可见github脚本

实际上单机多实例,只需要对配置进行修改即可轻松实现:

  • 创建主从数据库数据目录
    1
    2
    3
    4
    mkdir /usr/local/mysql/data
    mkdir /usr/local/mysql/data_slave
    chown -R mysql:mysql /usr/local/mysql/data
    chown -R mysql:mysql /usr/local/mysql/data_slave
Read more »
1…345…11
Jeff Xue

Jeff Xue

Think Bigger, Start Simple!
104 posts
10 categories
48 tags
GitHub
© 2016 – 2021 Jeff Xue
Powered by Hexo v3.9.0
|
Theme – NexT.Gemini v7.3.0