iterm2免密码登录Linux

用惯了Win的xshell,忽然到了mac下面就忽然茫然了,后来厚着脸问人家用什么工具,人家说用 iterm2+证书登录,恍然大悟,

os x 不也就是linux吗?

那就简单了,在iterm2 中输入ssh-keygen 一路回车

然后在~/.ssh 产生了id_rsa.pub和id_rsa 文件,将pub公钥上传到服务器的~/.ssh/authorized_keys ,然后修改配置

修改sshd配置文件(/etc/ssh/sshd_config).
找到以下内容,并去掉注释符”#“
=========================
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys
=========================

 

然后重启ssh,这下在iterm2 中配置下连接指令,搞定。

关于Chrome调试中.min.js.map 404的问题

前端在Chrmo F12模式下调试的时候,经常会遇到js.map文件找不到的情况,例如:

http://domain/AngularJS/v1.3.11/angular.min.js.map 404 (Not Found)

关于这个问题其实大可不比过分的纠集,一般只会在你引用了压缩的min.js 文件,chrome浏览器中才会出现

实际并不影响页面的执行效果。这里简单说下原理:

map文件是js文件压缩后,文件的变量名替换对应、变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下。

使开发者可以用未压缩前的代码来调试,这样就不会出现这个问题了,但是往往想使用min文件,而且还有强迫症的患者是非常难受的,那么取掉这个小x也很简单
打开chrome的F12界面,然后点击“设置”,去掉 Sources里面的 Enable JavaScript source maps

EG:

min.js.map - 副本

Java常见内存溢出异常分析(OutOfMemoryError)

1.背景知识

1).JVM体系结构

162853_WIxX_820500

2).JVM运行时数据区

162109_yFNI_820500

2.堆溢出(OutOfMemoryError:java heap space)

堆(Heap)是Java存放对象实例的地方。

堆溢出可以分为以下两种情况,这两种情况都会抛出OutOfMemoryError:java heap space异常:

1)内存泄漏

内存泄漏是指对象实例在新建和使用完毕后,仍然被引用,没能被垃圾回收释放,一直积累,直到没有剩余内存可用。

如果内存泄露,我们要找出泄露的对象是怎么被GC ROOT引用起来,然后通过引用链来具体分析泄露的原因。

分析内存泄漏的工具有:Jprofiler,visualvm等。

2)内存溢出

内存溢出是指当我们新建一个实力对象时,实例对象所需占用的内存空间大于堆的可用空间。

如果出现了内存溢出问题,这往往是程序本生需要的内存大于了我们给虚拟机配置的内存,这种情况下,我们可以采用调大-Xmx来解决这种问题。

示例:

package com.demo3;

import java.util.ArrayList;
import java.util.List;

public class OOMTest {

public static void main(String[] args) {
List<byte[]> buffer = new ArrayList<byte[]>();
buffer.add(new byte[10 * 1024 * 1024]);
}
}

通过如下命令运行程序:

java -verbose:gc -Xmn10M -Xms20M -Xmx20M -XX:+PrintGC OOMTest

输出结果:

[GC 836K->568K(19456K), 0.0234380 secs]
[GC 568K->536K(19456K), 0.0009309 secs]
[Full GC 536K->463K(19456K), 0.0085383 secs]
[GC 463K->463K(19456K), 0.0003160 secs]
[Full GC 463K->452K(19456K), 0.0062013 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.demo3.OOMTest.main(OOMTest.java:10)

3.持久带溢出(OutOfMemoryError: PermGen space)

持久带(PermGen space)是JVM实现方法区的地方,因此该异常主要设计到方法区和方法区中的常量池。

1).方法区

方法区(Method Area)不仅包含常量池,而且还保存了所有已加载类的元信息。当加载的类过多,方法区放不下所有已加载的元信息时,就会抛出OutOfMemoryError: PermGen space异常。主要有以下场景:

  • 使用一些应用服务器的热部署的时候,我们就会遇到热部署几次以后发现内存溢出了,这种情况就是因为每次热部署的后,原来的class没有被卸载掉。
  • 如果应用程序本身比较大,涉及的类库比较多,但是我们分配给持久带的内存(通过-XX:PermSize和-XX:MaxPermSize来设置)比较小的时候也可能出现此种问题。

2).常量池

常量池(Runtime Constrant Pool)专门放置源代码中的符号信息。常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值外,还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名;字段的名称和描述符;方法的名称和描述符等。

当常量池需要的空间大于常量池的实际空间时,也会抛出OutOfMemoryError: PermGen space异常。

例如,Java中字符串常量是放在常量池中的,String.intern()这个方法运行的时候,会检查常量池中是否存和本字符串相等的对象,如果存在直接返回对常量池中对象的引用,不存在的话,先把此字符串加入常量池,然后再返回字符串的引用。那么可以通过String.intern方法来模拟一下运行时常量区的溢出.

示例:

package com.demo3;
 
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
 
public class OOMTest {
 
    public static void main(String[] args) {
        List list = new ArrayList();
        while (true) {
            list.add(UUID.randomUUID().toString().intern());
        }
    }
}

通过以下命令运行:

java -verbose:gc -Xmn5M -Xms10M -Xmx10M -XX:MaxPermSize=1M -XX:+PrintGC OOMTest

最后的运行结果:

Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
        at java.lang.String.intern(Native Method)
        at OOMTest.main(OOMTest.java:8)

4.线程栈

栈(JVM Stack)存放主要是栈帧( 局部变量表, 操作数栈 , 动态链接 , 方法出口信息 )的地方。注意区分栈和栈帧:栈里包含栈帧。

与线程栈相关的内存异常有两个:

  • StackOverflowError(方法调用层次太深,内存不够新建栈帧)
  • OutOfMemoryError(线程太多,内存不够新建线程)

1).java.lang.StackOverflowError

栈溢出抛出java.lang.StackOverflowError错误,出现此种情况是因为方法运行的时候,请求新建栈帧时,栈所剩空间小于战帧所需空间。

例如,通过递归调用方法,不停的产生栈帧,一直把栈空间堆满,直到抛出异常 :

package com.demo3;
 
public class OOMTest {
    public void stackOverFlowMethod() {
        stackOverFlowMethod();
    }
 
    public static void main(String... args) {
        OOMTest oom = new OOMTest();
        oom.stackOverFlowMethod();
    }
}

运行结果:

Exception in thread "main" java.lang.StackOverflowError
    at com.demo3.OOMTest.stackOverFlowMethod(OOMTest.java:5)
    at com.demo3.OOMTest.stackOverFlowMethod(OOMTest.java:5)
    at com.demo3.OOMTest.stackOverFlowMethod(OOMTest.java:5)
    at com.demo3.OOMTest.stackOverFlowMethod(OOMTest.java:5)
    at com.demo3.OOMTest.stackOverFlowMethod(OOMTest.java:5)
    at com.demo3.OOMTest.stackOverFlowMethod(OOMTest.java:5)
    at com.demo3.OOMTest.stackOverFlowMethod(OOMTest.java:5)
    at com.demo3.OOMTest.stackOverFlowMethod(OOMTest.java:5)
    .....

2).java.lang.OutOfMemoryError:unable to create new native thread 

因为虚拟机会提供一些参数来保证堆以及方法区的分配,剩下的内存基本都由栈来占有,而且每个线程都有自己独立的栈空间(堆,方法区为线程共有)。所以:

  • 如果你把虚拟机参数Xss调大了,每个线程的占用的栈空间也就变大了,那么可以建立的线程数量必然减少
  • 公式:线程栈总可用内存=JVM总内存-(-Xmx的值)- (-XX:MaxPermSize的值)- 程序计数器占用的内存

如果-Xmx或者-XX:MaxPermSize太大,那么留给线程栈可用的空间就越小,在-Xss参数配置的栈容量不变的情况下,可以创建的线程数也就越小。

上述两种情况都会导致:当创建的线程数太多时,栈内存不够用来创建新的线程,那么就会抛出java.lang.OutOfMemoryError:unable to create new native thread 异常。

PS:由于在window平台的虚拟机中,java的线程是隐射到操作系统的内核线程上的,所以运行一下产生该异常的代码时,可能会导致操作系统假死。

 

[FROM:http://my.oschina.net/sunchp/blog/369412]

CentOS6.5升级Kernel

阿里云上的6.5CentOS模版还是2.6的内核,对Docker来说就有些低版本了(Docker推荐3.8 :)),于是着手升级

lsb_release -a
LSB Version:	:base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch
Distributor ID:	CentOS
Description:	CentOS release 6.5 (Final)
Release:	6.5
Codename:	Final

uname -a
Linux iZ289l79vfqZ 2.6.32-431.23.3.el6.x86_64 #1 SMP Thu Jul 31 17:20:51 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

为了配合Docker,使用YUM中的long-term 源升级

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum --enablerepo=elrepo-kernel install kernel-lt -y

升级完成后,修改启动内核,修改default=0 (新安装的内核在第一个)

default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.10.63-1.el6.elrepo.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-3.10.63-1.el6.elrepo.x86_64 ro root=UUID=94e4e384-0ace-437f-bc96-057dd64f42ee rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /boot/initramfs-3.10.63-1.el6.elrepo.x86_64.img
title CentOS (2.6.32-431.23.3.el6.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-431.23.3.el6.x86_64 ro root=UUID=94e4e384-0ace-437f-bc96-057dd64f42ee rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /boot/initramfs-2.6.32-431.23.3.el6.x86_64.img

重启,然后uname -a 查看。

CentOS 7 中Nginx proxy 502的问题

环境 CentOS Linux release 7.0.1406 (Core)     Nginx    tomcat

使用nginx做前端,proxy后端tomcat 8080 端口,浏览器死活502 ,⊙︿⊙。

stackoverflow 上发现同样有人遇到此问题,

http://stackoverflow.com/questions/23948527/13-permission-denied-while-connecting-to-upstreamnginx

翻阅了Nginx的blog

http://nginx.com/blog/nginx-se-linux-changes-upgrading-rhel-6-6/

此问题在6.6以上就出现了,sudo cat /var/log/audit/audit.log | grep nginx | grep denied

查阅SELinux 日志,发现问题

type=AVC msg=audit(1420460715.553:594): avc:  denied  { name_connect } for  pid=3425 comm=”nginx” dest=8080 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_cache_port_t:s0 tclass=tcp_socket

 

执行命令(yum -y install policycoreutils-python)

sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp

搞定,502请滚粗……

spring boot demo

Spring Boot使我们更容易去创建基于Spring的独立和产品级的可以”即时运行“的应用和服务。支持约定大于配置,目的是尽可能快地构建和运行Spring应用。

从spring的官方和百度上所谓的各路例子来说,几乎清一色的指向官方的demo,所以资料很少,自己半瞎半猜的摸索的半天,也算弄了个例子,总之费劲……

先从官方的Demo例子开始,按照指引相当简单了,新建maven功能,然后将pom.xml的依赖copy进去

动手写个两行代码就搞定了:

spring boot

 

然后 run as 就搞定了,所谓demo简单到爆。但是后来自己动手搭建一个demo,发现jar也不是很少的一件事……

spring boot jar

 

所以从所谓的快捷的角度来说只是相比于sping 那一套而言,对于快速开发来说个人觉得还谈不上,大家酌情选用吧。

Linux 文件同步

场景

为了适应更发规模流量的爆发,需要将服务器托管在云台上,也方便日后做物理托管分割,需要将服务器文件做同步

方案

采用Linux下常见的resync做文件同步

实施

演示环境centos 6.3 64bit

源服务器地址:192.168.1.238,目标服务器地址:192.168.1.239

在239上部署resync

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost ~]# rpm -qa | grep rsync
rsync-3.0.6-9.el6.x86_64
已经默认安装了,那么我们来做一下配置
vi /etc/rsyncd.conf
uid=root
gid=root
max connections=36000
use chroot=no
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
 
[tongbu]
path=/home/data
comment  = media video files
ignore errors = yes
read only = no
hosts allow =  192.168.1.238
hosts deny = *
 
配置完成,启动 
rsync --daemon
ps -ef | grep rsync
root      1304     1  0 14:36 ?        00:00:00 rsync --daemon
root      1307  1286  0 14:36 pts/0    00:00:00 grep rsync

简要说明 :

path为你要同步的文件目录,host allow为允许连接的IP,host deny 为拒绝的IP

这时候我们开始着手238的配置,选取工具 sersync (自行Google补脑)

文件:sersync2  和  confxml.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="true"/>
    <fileSystem xfs="false"/>
    <filter start="false">
	<exclude expression="(.*)\.svn"></exclude>
	<exclude expression="(.*)\.gz"></exclude>
	<exclude expression="^info/*"></exclude>
	<exclude expression="^static/*"></exclude>
    </filter>
    <inotify>
	<delete start="true"/>
	<createFolder start="true"/>
	<createFile start="false"/>
	<closeWrite start="true"/>
	<moveFrom start="true"/>
	<moveTo start="true"/>
	<attrib start="false"/>
	<modify start="false"/>
    </inotify>
 
    <sersync>
	<localpath watch="/home/data">
	    <remote ip="192.168.1.239" name="tongbu"/>
	</localpath>
	<rsync>
	    <commonParams params="-artuz"/>
	    <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
	    <userDefinedPort start="false" port="874"/>
	    <timeout start="false" time="100"/>
	    <ssh start="false"/>
	</rsync>
	<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/>
	<crontab start="false" schedule="600">
	    <crontabfilter start="false">
		<exclude expression="*.php"></exclude>
		<exclude expression="info/*"></exclude>
	    </crontabfilter>
	</crontab>
	<plugin start="false" name=""/>
    </sersync>
</head>
 
./sersync2 -r -d
set the system param
execute:echo 50000000 &gt; /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 &gt; /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -r rsync all the local files to the remote servers before the sersync work
option: -d run as a daemon
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
Open debug, you will see debug infomation
daemon start,sersync run behind the console
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /home/data &amp;&amp; rsync -artuz -R --delete ./ 192.168.1.239::tongbu
crontab command:cd /home/data &amp;&amp; rsync -artuz -R --delete ./ 192.168.1.239::tongbu
run the sersync:
watch path is: /home/data
add watch: /home/data return wd is: 1

Jquery中attr和prop属性

今天着手demo的时候发现了一个奇怪的问题,将Jquery的版本更新到最高版本的时候(之前还是1.3)全选框出现了怪异的问题,就是第一次点击全选OK,然后点击取消OK,当我第二次点击全选的时候功能失效了

:(

代码小样:

1
2
3
4
5
$('.check-all').click(
 function(){
  $(this).parent().parent().parent().parent().find("input[type='checkbox']").attr('checked', $(this).is(':checked'));   
  }
);

后来找到Jquery的官方说明,发现在1.6后新增了prop,后来释然了
修改后如下

1
2
3
4
5
$('.check-all').click(
 function(){
  $("#tbody :checkbox").prop('checked', $(this).is(':checked'));   
 }
);

表面上看起来attr和prop没有什么区别,但是细微地方和不同的浏览器还是会有差异的,这里附带官方的建议,方便留意:

attrprop

Jconsole 监控tomcat性能

最近让小朋友做一下性能的测试对比,于是挠头犯难了,所谓万事开头难,想要让自己理解的更深,往往不是你会使用多少框架,和多么熟练,而是能够快速的了解机制,做出相应的学习和上手对策,为以后更深入的打好基础,废话少说。

相信很多在做Java开发的朋友都没有关注过Jdk里面提供的工具包,今天简单说一下Jconsole,位置:Java的JDK包的bin目录下,不知道的同学可以搜搜。

jconsole

 

别说才发现下面有那么多好东西-_-#

双击Jconsole,你会看到这个界面

jconsole2

 

本地进程就是你当前的环境,直接点击就可以看到每个模块占用的资源情况,当然我们目的不是为了监控本地,而是监控服务器,

EG:监控测试环境中的Tomcat的情况

首先为tomcat添加参数,打开catalina.sh,添加

1
2
JAVA_OPTS='-server -Xms256m -Xmx256m'
JAVA_OPTS='-Djava.rmi.server.hostname=192.168.1.239 -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false'

如果性能调优需要自己不断的修改参数调整,是个长久的过程,这里不赘述,本次主要简介Jconsole,所以这就够了
然后在远程进程填写 IP和端口号

 

jconsole1

 

这样就比较直观了,剩下的大家随意吧。

网站性能优化手记——首页加载速度

在开发测试阶段时,平台在数据很小,或者在很随意的测试数据环境下没有什么感觉,但是随着数据量的增加,性能的问题就会出现了,我们在不断忍耐的同时,很容易到达一个临界点——不可忍受。

从原来的秒开,然后现在强制刷新需要5.84s+,

5s

经过浏览器缓存后,效果依旧很恶心:( ,维持在2+~3s之间,这可是首页啊,这样的速度应该被认为是不可忍受的,这样就需要优化了。

要把首页搞定到秒开,需要调试前后的 web server,但是从上午追踪的情况来看对server的优化已经远不能达到预期的效果,只可能从代码端去优化了,

在打开indexAction后,一切明朗了…… 最简单的办法就是分请求,利用多线程去加载,而不是一路向下,不过那么多的数据分层需要一段时间才能搞定,眼下最简单的就是增加首页缓存,然后效果斐然:)

2ms

如此这般,心满意足,达到了秒开的效果 。

然后设定了清理缓存的路径,这时候的问题来了,因为设定的缓存是永久不失效的,同时还要防止被别人嗅探到,不停的秀逗你造成雪崩,还有某些不按套路来的蜘蛛!!那么就只好加上权限了:

环境 CentOS 6.4x64bit,前端Nginx,后端Tomcat。最好的办法在Nginx上做文章,效果好,效率佳。

创建用户数据库 htpasswd -c  user.db   username

输入username的密码。

Nginx 配置路径 (片段)eg:

location ~ /admin{
auth_basic “Restricted”;
auth_basic_user_file user.db;//完整的物理路径
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

然后在你访问domain/admin/* 这个路径的时候便会先到验证页面了。

pass