小组分享会--日常使用命令以及运维和java相关内容

  这周一小组分享会要我来分享内容了,我写了一些日常是使用的shell命令,这些命令之前的博客可能也有写,这次再次提一下,另外一部分内容就是我整理的java和运维相关的一些资料,因为小组其他成员都是java开发。

 

一、常用的shell命令

1.1、sed
常用的功能:替换、删除

把一定时间段内的文件内容导入到另一个文件
sed -n '/2019-02-28 12:00:00/,/2019-02-28 12:10:00/'p hbaseserv.log >> /home/hduser/hbaseserve_12_10.log
sed -n '/2019-02-28 12:10:00/,/2019-02-28 12:20:00/'p hbaseserv.log >> /home/hduser/hbaseserve_12_20.log

sed -n '/10[1-4]/p' file 只显示文件file中包含101-104的行

sed 's/moding/moden/g' file 将moding替换为moden

sed 's/:/ /g' file 替换冒号为空格

sed -ir 's#/data/usr/hadoop1#/data/usr/hadoop#' * 替换文件内容

sed -i '/^/abc/' file 文首加字段

sed -i '/$/abc/' file 文尾加字段

sed -i '1,1000000d' nohup.out 删除日志文件的前10000000行

sed '/10[1-4]/d' file 删除包含101-104的行

sed '/^ *$/d file 删除文件中的空行

sed 's/...$//' file 删除每一行的最后三个字符

sed 's/^...//' file 删除每一行的头三个字符

-i 参数 加上,表示显示并修改文件内容,不加只是显示效果,不修改文件内容,可以加个重定向把内容放到其他文件中。


1.2、grep
常见用法:对查询内容进行过滤

ps -ef | grep tomcat

grep -v '^hello' a.txt 查看文件不是以hello开头的行

grep -v -wvf file file2 查看俩文件 不同的行

grep -wf file file2 查看俩文件 相同的行

ps aux --sort=-pcpu | head -10 查看进程占用CPU

ps aux --sort -rss | head -10 查看进程占用内存

grep -ir "error" * 查找目录下含有某个字段的文件

-i 不区分大小写
-r 递归查询该目录下所有子目录及文件

egrep -v "^#|^$" /etc/nginx/nginx.conf 过滤空行和注释行

grep `date +%d/%b/%Y` access.log | grep "home/index.html" -c 统计网站PV,统计当天/home/index页面点击量

1.3、分割合并文件

按行数分割
split -l 500 file.txt new_file
会分割为new_filea、new_fileb、new_filec ......

加上-d,使用数字后缀;加上--verbose,显示分割进度

按文件大小分割
split -b 50m file.txt new_file

合并
cat new_file* > file.txt

1.4、find
常见用法:按照条件查找文件

find /data/hadoop -name "hdfs-site.xml" 查询目录下文件

如果只查询以及目录加上参数 -maxdepth 1

按照条件找出文件压缩后删除源文件
find -mtime +3 -name "*.log"| xargs zip -rm log.zip
find -mtime +3 -name "*.log" -exec zip -rm log.zip

1.5、linux下删除windows文件的字符^M(ctrl-v)

: %s/^M$//g # 去掉行尾的^M
: %s/^M//g # 去掉所有的^M
: %s/^M/\r/g # 将^M替换成回车

sed -i 's/^M/\n/g' file

1.6、生成md5
openssl dgst -md5 /etc/passwd
md5sum /etc/passwd

1.7、查看进程启动文件
首先查看进程号
ps -ef |grep nginx
通过进程号查看启动文件
ls -lrt /proc/$PID

1.8、查看目录下文件大小,并排序
du -shm * | sort -nr

1.9、删除了 /tmp 目录下的文件,但是空间没有释放
lsof | grep delete | grep /tmp

查出进程后kill掉(要确认进程可以杀掉),就可以释放空间

原因:使用rm 删除的文件原理:rm命令只是把链接解除(unlink),假设文件是被打开的(有一个进程正在使用),进程仍然可以读取已删除的文件,所以并不释放磁盘空间。

二、java相关
参考:
https://www.cnblogs.com/cheyunhua/p/10855036.html

2.1、OOM
对于高负载的java应用,默认的配置运行下来会有很吃力。

2.1.1、出现比较多的情况
生产中出现 OOM 的情况,最多的原因,其一是内存不足,其二就是 GC 开销超过限制。

对于第一种情况,我们解决方案是:
为机器分配更多的内存
减少 Java 堆空间
修复应用程序中的线程泄漏
增加操作系统级别的限制
ulimit
用户进程数增大 (-u) 1800
使用 -Xss 减小线程堆栈大小

对于第二种情况,我们解决思路是:
降低 GC 频率,可以通过增大堆空间,减少不必要对象生成;
降低 GC 暂停时间,可以通过减少堆空间,使用 CMS GC 算法实现;
避免 Full GC,调整 CMS 触发比例,避免 Promotion Failure 和 Concurrent mode failure(老年代分配更多空间,增加 GC 线程数加快回收速度),减少大对象生成等。

2.1.2、举例 hadoop
以生产中 hadoop 为例:

下面截取了一段去年 hadoop OOM 的日志,如下所示:
019-05-11 16:20:26,551 ERROR org.apache.hadoop.hdfs.server.datanode.DirectoryScanner: Error compiling report
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.getDiskReport(DirectoryScanner.java:566)
at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.scan(DirectoryScanner.java:425)
at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.reconcile(DirectoryScanner.java:406)
at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.run(DirectoryScanner.java:362)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded

分析:
GC占用大量时间但释放很小空间,超出了GC开销限制。

Sun 官方对此的定义:超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出 java.lang.OutOfMemoryError 异常。

解决办法:
加大堆内存
优化GC

编辑配置文件 etc/hadoop/hadoop-env.sh ,修改 HADOOP_DATANODE_OPTS 参数为下所示:
export HADOOP_DATANODE_OPTS="-Xmx16G -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled -XX:+PrintTenuringDistribution"

参数说明:
JVM分别对新生代和旧生代采用不同的垃圾回收机制

并发收集器CMS具有响应时间优先的特点,所以是低延迟、低停顿的,CMS是老年代收集器。

-Xmx6G 堆内存设置为6G
-XX:+UseParNewGC 设置新生代内存收集为并行收集
-XX:+UseConcMarkSweepGC 使用CMS垃圾收集器,来为老年代内存并行收集
-XX:CMSInitiatingOccupancyFraction=80 设置Old区当对象存满80%的时候触发Full GC
-XX:+CMSParallelRemarkEnabled 并行运行最终标记阶段,加快最终标记的速度,降低标记停顿
-XX:+PrintTenuringDistribution 显示每次Minor GC时Survivor区中各个年龄段的对象的大小

2.1.3、举例 tomcat
但并不是所有的应用都是可以用上边的方法解决的,有些需要我们去具体分析,例如 tomcat 出现 OOM 问题,有时候是我们代码的问题。

如果 tomcat 经常出现 OOM,可以使用下面的方法排查问题:
首先查看tomcat的进程号
把线程栈信息导出到文件中进行初步分析 jstack -l 384>/Jstack_20200607.txt
dump java堆数据 jmap -dump:file=Dump_20200607.dump $PID
接下来使用 MAT 加载堆文件,进一步分析。

不过在实际运行中,往往一次 dump的信息,还不足以确认问题。建议产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。

另外一点是一般出现 OOM 的情况是随机的,所以不太容易使用命令 dump 出堆文件,所以建议在 tomcat 的启动脚本配置参数,发生 OOM 时导出堆内存快照。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=目录.hprof


2.2、安全
2.2.1、移除容器版本信息
修改文件server.xml,如下
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" Server =" "
redirectPort="8443" />

2.2.2、为Cookie设置HttpOnly属性
修改tomcat/conf/context.xml
<Context useHttpOnly="true"></context>

修改tomcat/conf/web.xml
<session-config>
<cookie-config>
<http-only>true</http-only>
</cookie-config></span>
</session-config>

2.2.3、普通用户启动

2.2.4、禁用管理端
删除webapps目录下Tomcat原有的所有内容
删除conf/Catalina/localhost/下的host-manager.xml和manager.xml这两个文件

2.2.5、屏蔽目录文件自动列出
编辑conf/web.xml文件
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

这里false为不列出,true为充许列出
<param-value>false</param-value>

2.2.6、替换默认的404,403,500页面,和避免异常报错暴露在页面
在web.xml文件下添加到</web-app>之前

<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>

posted @ 2020-06-11 17:58  断臂人123  阅读(251)  评论(0编辑  收藏  举报