Linux CPU占比高的分析方法

基本思路 top: 查看到CPU占比高的进程号pid; top -H -p $pid: 查看进程内各个线程占用的CPU百分比,找到CPU占比高的线程ID; gstack $pid > gstack.log: 找到线程ID对应线程号; gcore $pid: 使用gcore命令转存进程映像及内存上下文,生成core文件; strace -T -r -c -p $pid 或 strace -o output.txt -T -tt -e trace=all -p $pid:用strace命令查看系统调用和花费的时间; gdb: 然后用gdb调试对应的线程; 测试代码

参考 http://m.blog.csdn.net/article/details?id=47830579

C++ virtual关键词理解

多态 (待续) 虚函数 C++中的虚函数的实现一般是通过虚函数表(C++规范并没有规定具体用哪种方法,但大部分的编译器厂商都选择此方法)。 类的虚函数表是一块连续的内存,每个内存单元中记录一个JMP指令的地址。 注意的是,编译器会为每个有虚函数的类创建一个虚函数表,该虚函数表将被该类的所有对象共享。类的每个虚成员占据虚函数表中的一行。如果类中有N个虚函数,那么其虚函数表将有N*4字节的大小。 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其真实反应实际的函数。这样,在有虚函数的类的实例中分配了指向这个表的指针的内存,所以,当用父类的指针来操作一个子类的时候,这张虚函数表就显得尤为重要了,它就像一个地图一样,指明了实际所应该调用的函数。 编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下)。 这意味着可以通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。 (引用: http://www.baike.com/wiki/%E8%99%9A%E5%87%BD%E6%95%B0%E8%A1%A8 ) 纯虚函数 (待续) 例子 (待续) 虚函数的重要规则 如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行滞后联编的。 只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数。 静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象。 内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义,但是在编译的时候系统仍然将它看做是非内联的。 构造函数不能是虚函数,因为构造的时候,对象还是一片未定型的空间,只有构造完成后,对象才是具体类的实例。 析构函数可以是虚函数,而且通常声名为虚函数。 菱形继承(虚基类) (待续) 析构函数 根据上述规则6,具有多态特性的类的析构函数,有必要声明为virtual。如下实例,如果析构函数不用virtual修饰,无法调用子类的析构函数:

输出结果:

如果析构函数不用virtual修饰,则输出结果:

The “HoeflerText” font wasn’t found——解决方法

打开网站时提示The “HoeflerText” Font Wasn’t Found,很像浏览器提示的错误,用户容易去点击“Update”(如下图),实际是网站被植入了攻击代码。详细攻击原理见:https://www.pcrisk.com/removal-guides/11048-the-hoeflertext-font-wasnt-found-scam 解决方法 我遇到的这种攻击,植入代码很简单,是Wordpress的主题index.php第一行被植入了攻击代码,会生成对应的js代码。直接删掉就行。 为什么直接写到php文件了?原因也很简单,文件权限被设为了777。这是不少开发者为了图简单,对apache的配置也不熟悉,就一开始简单的把权限设为777,后来忘了。 这类代码植入是否有其它手段?有空再琢磨。

C++空指针调用成员函数

先看代码

输出结果: I’m in normal_func Segmentation fault 分析 就是“静态绑定”和“动态绑定”的问题。 参考: https://www.zhihu.com/question/23260677

sar分析Linux系统瓶颈

介绍 sar是System Activity Reporter(系统活动情况报告)的缩写。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。 sar是查看操作系统报告指标的各种工具中,最为普遍和方便的;它有两种用法; 1. 查看历史统计数据(默认) 2. 周期性的查看当前数据 查看历史统计数据 历史数据一般保留一个月,文件名后缀的数字就是日期,存放目录为/var/log/sa或/var/log/sysstat/。

查看CPU使用率 sar -u : 默认情况下显示的cpu使用率等信息就是sar -u;

%user: 用户模式下消耗的CPU时间的比例; %nice: 通过nice改变了进程调度优先级的进程,在用户模式下消耗的CPU时间的比例 %system: 系统模式下消耗的CPU时间的比例; %iowait: CPU等待磁盘I/O导致空闲状态消耗的时间比例; %steal: 利用Xen等操作系统虚拟化技术,等待其它虚拟CPU计算占用的时间比例; %idle: CPU空闲时间比例 查看内存使用情况 sar -r: 指定-r之后,可查看物理内存使用情况;

kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间. kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间. %memused:物理内存使用率,这个值是kbmemused和内存总量(不包括swap)的一个百分比. kbbuffers和kbcached:这两个值就是free命令中的buffer和cache. kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap). %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比. 查看平均负载 sar -q: 查看平均负载 指定-q后,就能查看运行队列中的进程数、系统上的进程大小、平均负载等;与其它命令相比,它能查看各项指标随时间变化的情况;

runq-sz:运行队列的长度(等待运行的进程数) plist-sz:进程列表中进程(processes)和线程(threads)的数量 ldavg-1:最后1分钟的系统平均负载 ldavg-5:过去5分钟的系统平均负载 ldavg-15:过去15分钟的系统平均负载 查看页面交换发生情况 sar […]

免费SSL证书的使用——Let’s Encrypt

Let’s Encrypt Let’s Encrypt 是一个于2015年三季度推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书。 Let’s Encrypt 是由互联网安全研究小组(ISRG,一个公益组织)提供的服务。主要赞助商包括电子前哨基金会,Mozilla基金会,Akamai以及思科。2015年4月9日,ISRG与Linux基金会宣布合作。 用以实现这一新的数字证书认证机构的协议被称为自动证书管理环境(ACME)。GitHub上有这一规范的草案,且提案的一个版本已作为一个Internet草案发布。 Let’s Encrypt 宣称这一过程将十分简单、自动化并且免费。

官网:https://letsencrypt.org 官网推荐工具配置方法:https://certbot.eff.org/#centosrhel7-other 维基百科:https://zh.wikipedia.org/wiki/Let’s_Encrypt Nginx (还没在nginx上用过,大同小异吧,后续再补) Traffic Server 我使用的环境是Traffic Server,apache或nginx等其它web服务器的配置万变不离其宗。 Traffic Server配置SSL如下:

注意证书目录的权限,我把用户和用户组设置与trafficserver相同才可以。如果还不行,请查看diags.log日志。 Wrodpress 因为我是在代理服务器配置了SSL,web服务器可以不走SSL。如果不是这种情况,这部分可略过。代理服务器与web服务器之间是不是需要SSL,视自己的情况而定。 由于wordpress会在代码层面包含协议(http或https)和域名,会导致页面很多链接和静态文件是http的,被浏览器拒绝加载。理论上wordpress会自动检测协议,但不准确。最简单粗暴的做法如下:

技术大牛推荐加强软件开发基础的文章和书

跟大牛沟通交流加强软件开发基础,给了如下建议: 推荐研读的书: 《tcp/ip详解》、《计算机体系结构》 推荐的文章: http://fex.baidu.com/blog/2014/05/what-happen ,搞清楚这个流程里的主要问题 总结 (待续)

WordPress的Markdown编辑器

Markdown是一种轻量级标记语言。Github的README就是用这个,越来越流行,确实很方便。Wordpress上也有相应的编辑器。 WP Markdown Editor 本文由此插件编辑所得,其中代码部分由Crayon Syntax Highlighter插件生成。 标题1 标题2 标题3 一串斜着的字 黑色 白色 红色 C/C++ Java Python

Javascript代码编译:压缩和混淆

Google closure 下载Closure编译的jar包 下载Closure Compiler(下载不了的自行想办法哈,需要梯子,你懂的) 创建js文件 如命名为hello.js

编译js文件 编译:

编译后的代码:

参考: https://developers.google.com/closure/ https://developers.google.com/closure/compiler/docs/gettingstarted_app 其它类似工具 Uglfyjs YUI Compressor

基于Play Framework和Semantic-UI的用户登录和注册实现(play-java-loginner)

play-java-loginner是基础性模块,主要实现用户登录和注册实现,网站可基于此直接开发。代码见github,便于将持续维护和完善。 Play Framework,相比Spring MVC,个人比较喜欢这个框架。 Semantic-UI,用过Bootstrap,这个相比元素丰富得多。 Apache Shiro,安全框架 Ebean,ORM