常用shell

常用 shell

1
2
3
4
5
6
7
8
9
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
$UID 当前为root用户时值为0
1
2
3
4
5
查看文件
cat 文件名|head -n 5
cat 文件名|tail -n 2
cat 文件名|sed -n 'x,yp'
打印出x,y行,p理解为print

unable to create new native thread的错误异常

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
➜ ~ ulimit -u
709
[root@iZ2809ocw4jZ ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7798
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7798
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
注: ulimit -u是显示用户最多可开启的程序数目
程序JVM参数设置如下:
java OOMTest 4000 -Xmx500m -Xss2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
java OOMTest 4000 -Xmx500m -Xss2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
java OOMTest 40000 -Xmx500m -Xss2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
使用ulimit -u 65535命令或者直接修改limits.conf文件,将max user process参数修改为65535。
当max user processers 设置的较小的时候,影响系统线程数目的是max user processers的设置。
当max user processers设置为65535的时候,影响系统线程数目的是系统的内存。
对外的异常信息均为:OOM:unable to create native thread。
1
2
3
4
5
6
7
8
9
10
11
12
13
对于Java中的线程,我之前的理解一直是在Java中new新线程的时候是直接使用JVM的内存,可实际情况却不是这样的。在Java中每个线程需要分配线程内存,用来存储自身的线程变量,在JDK 1.4中每个线程是256K的内存,在JDK 1.5中每个线程是1M的内存,JDK 1.6以上版本不太清楚。在Java中每new一个线程,JVM都是向操作系统请求new一个本地线程,此时操作系统会使用剩余的内存空间来为线程分配内存,而不是使用JVM的内存。这样,当操作系统的可用内存越少,则JVM可用创建的新线程也就越少,我们举一个例子如下
如何来分析当前系统配置能够支持多少线程呢?
总内存 -Xmx -Xms -Xss 剩余内存 线程数
1024M 256M 256M 1M 768M 768
(MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads
解释下几个参数的含义:
MaxProcessMemory:进程最大寻址空间。
JVMMMEMORY:JVM内存空间(堆+永久区)-Xmx大小 (应该是实际分配大小)。
ReservedOsMemory:操作系统预留内存。
ThreadStackSize:-Xss大小。
1
2
3
4
5
6
7
8
解决:
1、优化程序,减少没用的log4j日志输出,将log4j日志改为异步+buffer的模式。
2、单台服务器本身性能有限,通过增加服务器的方式提高扩展性。
3、将系统的一些限制属性增大,如:ulimit -a。
4、当发现这个错误的时候,第一时间要排查程序是否有bug,是否大量的创建了线程,或者没有正确使用线程池,比如:是否使用了Executors.newCachedThreadPool()方法,该方法能创建Integer最大值个线程,创建到一定程度的时候系统资源耗尽就会报错。
5、如果发现程序中并没有使用线程却依然报这个错,那么观察一下这个时刻的并发情况如何,要是溢出的这一时刻比其他时候并发量都要大,这时先查看一下系统资源的情况,使用ulimit –a查看max user processes和open files这二个属性的值越大,能创建的线程数也就越大。
6、如果以上二个属性调大依然报错的话,说明此时受限于系统内存资源了,要是服务器本身内存就比较小的话,建议增加内存。要是服务器内存比较大,就需要通过调整jvm参数来增加线程使用的内存,比如减小-Xss值,这个值越小能创建的线程数也就越多,也可以适当减少-Xmx和-Xms的值,增加堆外内存的容量。