工作常用笔记

同步异步、阻塞非阻塞

同步与异步
同步和异步关注的是消息通信机制;
同步:一个调用得到结果之前不会返回,调用者需要等待调用的结果;
异步:调用发出后直接返回,不等待结果,结果需要被调用者通过某种方式通知调用者;
阻塞与非阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态;
阻塞:调用结果返回之前,当前线程会被挂起
非阻塞:不能立刻得到结果之前,该调用不会阻塞当前线程

IO模型中的NIO(Non-blocking IO)与Java中所说的NIO(New IO)不是一个概念,Java的NIO(new IO)技术,使用的就是IO多路复用模型。在linux系统上,使用的是epoll系统调用
10分钟看懂, Java NIO 底层原理

Jmeter

历史插件下载地址:

https://jmeter-plugins.org/downloads/old/

命令相关

### 基本命令格式:
jmeter -n -t <test JMX file> -l <test log file> -e -o <Path to output folder>
# 样例:
jmeter -n -t F:\PerformanceTest\TestCase\script\getToken.jmx -l testLogFile -e -o ./output

# 基本命令格式:
jmeter -g <log file> -o <Path to output folder>
# 样例:
jmeter -g D:\apache-jmeter-3.0\bin\testLogFile -o ./output

### 一些脚本编写技巧
# 使用正则表达式提取参数:
引用名称:对应保存的变量名
正则表达式:略
模板:正则表达式中的group,$2$对应组2,依次类推
匹配数字:一般都是0,不知道干嘛的
缺省值:匹配不到的时候的默认值

# 使用BeanShell PostProcessor保存全局变量:
# 将某一线程组内的变量通过__setProperty函数设置成Jmeter的全局变量
# 在另一线程组中通过__P(parameters,)}函数调用即可
# 这写方法可以直接在BeanShell中使用,虽然长得不像Java代码,但是Jmeter可以识别
${__setProperty(${uid}_token,${token},)};
${__P(${uid}_token,)}

# 操作变量
# 线程之间不共享
# 通过使用Bean shell内置对象vars可以对变量进行存取操作
# 参数支持Jmeter的${xxx}变量
vars.put("key", "value");
vars.get("key");

# 操作属性
# 通过使用Bean shell内置对象props 可以对属性进行存取操作
# 默认属性定义在jmeter.properties中
props.get("START.HMS");
props.put("PROP1","1234");

# Bean Shell中同样支持函数的编写,写法和Java中一样,该怎么导包还怎么导包

Java

VM启动参数配置

http://www.cnblogs.com/andy-zhou/p/5327288.html

java -Xmx3550m -Xms3550m -Xmn2g –Xss128k
# -Xmx8g:JVM最大可用堆内存
# -Xms8g:JVM初始化堆内存,一般设置Xms=Xmx
# -Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
# -Xss128k:设置每个线程的堆栈大小

JAVA_OPTS="-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.31.3.245"
# 注:tomcat应当使用CATALINA_OPTS进行配置
# 其中这一段-XX:+UnlockCommercialFeatures -XX:+FlightRecorder商业上需要收费的
# jmc的飞行记录器需要开启这个

Linux下,Java环境变量配置

编辑/etc/profile,最下方添加

JAVA_HOME=/opt/jdk1.8.0_181
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH

这个里面也加一份/etc/bashrc

获取一天前的时间(JAVA)

Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, -1);
date = calendar.getTime();

Java的一些小知识点

// 解决exec执行复杂命令,管道符失效的问题
// linux下:
String[] command = { "/bin/sh", "-c", cmds };
Process ps = Runtime.getRuntime().exec(command );
// windows下:
String[] command = { "cmd", "/c", cmds };
Process ps = Runtime.getRuntime().exec(command );

// 函数中有死循环,可以不要返回值,如:
public int test() {
	while (true) {}
}

// SpringBoot中获取resources目录中的东西
Resource resource = new ClassPathResource("resource目录下的文件路径");
File file = resource.getFile();
// 如:
Resource resource = new ClassPathResource("scripts/test.jmx");
File file = resource.getFile();

// SpringBoot获取项目根目录
ClassUtils.getDefaultClassLoader().getResource("").getPath();

Java线程状态&转换

Java语言定义的线程状态分析

Java 8新特性学习

Lambda 表达式
简单示例:
() -> 5
x -> 2 * x
(x, y) -> x – y
(int x, int y) -> x + y
(String s) -> System.out.print(s)
(int a, int b) -> { return a * b; }

方法引用:
方法引用通过方法的名字来指向一个方法
方法引用使用一对冒号::
构造器引用:它的语法是Class::new
静态方法引用:它的语法是Class::static_method
特定类的任意对象的方法引用:它的语法是Class::method
特定对象的方法引用:它的语法是instance::method

函数式接口:
package:java.util.function

默认方法:
默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法
我们只需在方法名前面加个 default 关键字即可实现默认方法
如果子类实现的多个接口中有同名的默认方法,在使用的时候子类可以复写该方法,或者在使用的之后指定具体的父类.super.方法,如:Vehicle.super.print();

Optional 类:
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。
Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。

Steam:
在Java 8中, 集合接口有两个方法来生成流:stream() − 为集合创建串行流;stream() − 为集合创建串行流。
流式操作:

OptionalInt java.util.stream.IntStream.reduce(IntBinaryOperator op)
reduce方法可以将流中的数据依次处理,最终计算出一个值,比如可以很方便的完成对一个数组的阶乘操作

void java.util.stream.IntStream.forEach(IntConsumer action)
forEach方法可以用来迭代流中的每个数据

IntStream java.util.stream.IntStream.map(IntUnaryOperator mapper)
map方法可以对流中的每个数据进行一次处理,比如对一个List每一个数字求平方等

IntStream java.util.stream.IntStream.filter(IntPredicate predicate)
filter方法通过设置条件,过滤流中的元素

IntStream java.util.stream.IntStream.limit(long maxSize)
limit方法用于获取指定数量的流

IntStream java.util.stream.IntStream.sorted()
sorted方法用于对流进行排序

R java.util.stream.Stream.collect(Collector<? super T, A, R> collector)
R java.util.stream.Stream.collect(Supplier supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner)
没看明白啥意思。。

IntSummaryStatistics java.util.stream.IntStream.summaryStatistics()
summaryStatistics方法可以返回一个IntSummaryStatistics对象,此对象具有一些对数值类型的基本统计功能,如:getMax、getMax、getMax、getAverage等

Linux

  1. /etc/profile: 用来设置系统环境参数,比如$PATH. 这里面的环境变量是对系统内所有用户生效的;
  2. /etc/bashrc: 这个文件设置系统bash shell相关的东西,对系统内所有用户生效。只要用户运行bash命令,那么这里面的东西就在起作用。
  3. ~/.bash_profile: 用来设置一些环境变量,功能和/etc/profile 类似,但是这个是针对用户来设定的。
  4. ~/.bashrc: 作用类似于/etc/bashrc, 只是针对用户自己而言,不对其他用户生效。
  5. ~/.bash_profile 是交互式、login 方式进入 bash 运行的,意思是只有用户登录时才会生效。
  6. ~/.bashrc 是交互式 non-login 方式进入 bash 运行的,用户不一定登录,只要以该用户身份运行命令行就会读取该文件。
  7. /etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系。

示例:查找ifconfig所属包,然后安装

$ yum search ifconfig
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cqu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirror.lzu.edu.cn
============================================================================================= Matched: ifconfig =============================================================================================
net-tools.x86_64 : Basic networking tools

$ yum install net-tools.x86_64

检查/安装/启动ssh服务

# ssh服务,一般来说已经配好了

# 查看一下是否已安装相关软件包
$ rpm -qa | grep ssh
openssh-clients-7.4p1-16.el7.x86_64
libssh2-1.4.3-10.el7_2.1.x86_64
openssh-7.4p1-16.el7.x86_64
openssh-server-7.4p1-16.el7.x86_64

# 如果没有,则需要安装
$ yum install openssh-server

# 查看ssh服务状态,开启ssh服务略
$ service sshd status
Redirecting to /bin/systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-12-15 06:18:20 EST; 7h left
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 1038 (sshd)
   CGroup: /system.slice/sshd.service
           └─1038 /usr/sbin/sshd -D

Dec 15 06:18:20 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
Dec 15 06:18:20 localhost.localdomain sshd[1038]: Server listening on 0.0.0.0 port 22.
Dec 15 06:18:20 localhost.localdomain sshd[1038]: Server listening on :: port 22.
Dec 15 06:18:20 localhost.localdomain systemd[1]: Started OpenSSH server daemon.
Dec 15 06:26:59 localhost.localdomain sshd[1518]: Accepted password for root from 192.168.126.1 port 9639 ssh2
Dec 15 06:26:59 localhost.localdomain sshd[1522]: Accepted password for root from 192.168.126.1 port 9641 ssh2

# 查看ssh的端口是否打开
$ netstat -ntpl | grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 17816/sshd
tcp6 0 0 :::22 :::* LISTEN 17816/sshd

sar、iostat

$ yum search sysstat
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cqu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirror.lzu.edu.cn
=========================================================================================== N/S matched: sysstat ============================================================================================
sysstat.x86_64 : Collection of performance monitoring tools for Linux

  Name and summary matches only, use "search all" for everything.

$ yun install sysstat.x86_64

VMware安装Centos虚拟机,初始化配置

  1. 网络适配器选择桥接模式即可(不需要勾选复制物理网络连接状态,实在上不去网再勾选试试看)
  2. 编辑/etc/sysconfig/network-scripts/ifcfg-ens33(一般都是ens33)
  3. 注意最后一行ONBOOT=yes,默认是no,改成yes重启即可,应该是只修改这一行即可
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=04eb5440-c486-44e7-96e7-0b174960812f
DEVICE=ens33
ONBOOT=yes

vim配置(直接拿大神的配置即可,需配置FQ代理)

参见:超级强大的vim配置(vimplus)

git clone https://github.com/chxuan/vimplus.git ~/.vimplus
cd ~/.vimplus
./install.sh

Shell常用命令

sar -n DEV 1 3
du -sh *
df -lh
fdisk -l

top -Hp pid

# 解决远程挂载不上的问题
yum install nfs-utils

# yum查看安装的软件,卸载软件
yum list installed | grep docker
yum -y remove docker-engine.x86_64

# nmon常用
ps -ef | grep nmon | awk '{print $2}'| xargs kill -9
./nmon -f -t -s 30 -c 900000

# 格式化/挂载磁盘
mkfs.ext3 /dev/xvde
mkdir -p /opt/huawei
mount /dev/xvde /opt/huawei
vi /etc/fstab
/dev/xvde /opt/huawei ext3 defaults 0 0

# 查看端口占用进程
lsof -i:端口号
netstat -tunlp|grep 端口号

# sed
sed -i "s#localhost:8080#172.18.84.135:18080#g" file(s)

# 查看一个进程启动的详细时间
ps -p 613742 -o lstart

##### https://blog.csdn.net/drievn/article/details/53179180 #####
# 查看CPU各个核心的资源占用情况,每秒
mpstat -P ALL 1 10

# 查看进程绑定的CPU信息统计,多进程应用会存在CPU绑定不均匀导致CPU使用不均匀的问题
pidstat | grep php-fpm | awk '{print $(NF-1)}' | sort | uniq -c

# 绑定进程的脚本
#!/bin/bash
CPUs=$(grep -c "processor" /proc/cpuinfo)
PIDs=$(ps -aux|grep "php-fpm[:] pool"|awk 'print $2}')
let i=0
for PID in $PIDs;do
    CPU=$(echo "$i%$CPUs"|bc)
    let i++
    taskset -pc $CPU $PID
done

##### http://blog.chinaunix.net/uid-23284114-id-3549663.html #####
# 参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次。
iostat -d -k 1 10
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              39.29        21.14         1.44  441339807   29990031
sda1              0.00         0.00         0.00       1623        523
# tps:该设备每秒的传输次数,“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
# kB_read/s:每秒从设备(drive expressed)读取的数据量。
# kB_wrtn/s:每秒向设备(drive expressed)写入的数据量。
# kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes

iostat -x 1
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.36    0.03    0.61     0.48    21.03    67.94     0.01   12.80    3.64   13.22   0.49   0.03
vdb               0.00     0.00    0.00    0.00     0.00     0.00    24.06     0.00    5.53    5.68    0.42   1.64   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
# -x参数可以显示更多统计信息
# rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读 取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
# (我的iostat版本没这个显示)rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。
# r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;
# await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
# %util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备 的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因 为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。 

# 常见用法
# 查看TPS和吞吐量信息
iostat -d -k 1 10
# 查看设备使用率(%util)、响应时间(await)
iostat -d -x -k 1 10
# 查看cpu状态
iostat -c 1 10

##### sar常用命令:https://www.cnblogs.com/howhy/p/6396437.html #####
# 统计CPU使用情况
sar -u 1 3
04:52:55 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
04:52:56 PM     all      0.13      0.00      0.13      0.00      0.00     99.75
04:52:57 PM     all      0.13      0.00      0.13      0.00      0.00     99.75
04:52:58 PM     all      0.50      0.00      0.25      0.12      0.00     99.12
Average:        all      0.25      0.00      0.17      0.04      0.00     99.54
# %user #用户空间的CPU使用
# %nice 改变过优先级的进程的CPU使用率
# %system 内核空间的CPU使用率
# %iowait CPU等待IO的百分比 
# %steal 虚拟机的虚拟机CPU使用的CPU
# %idle 空闲的CPU
# 在以上的显示当中,主要看%iowait和%idle,%iowait过高表示存在I/O瓶颈,即磁盘IO无法满足业务需求,如果%idle过低表示CPU使用率比较严重,需要结合内存使用等情况判断CPU是否瓶颈。

# 显单个CPU的使用情况
sar -P 0 1 3
06:42:13 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
06:42:14 PM       0     53.00      0.00      6.00      0.00      0.00     41.00
06:42:15 PM       0     57.58      0.00      4.04      0.00      0.00     38.38
06:42:16 PM       0     52.58      0.00      6.19      0.00      0.00     41.24
Average:          0     54.39      0.00      5.41      0.00      0.00     40.20
# CPU 第几个CPU
# %user 用户态的CPU使用统计
# %nice 更改过优先级的进程的CPU使用统计
# %iowait CPU等待IO数据的百分比
# %steal 虚拟机的vCPU占用的物理CPU的百分比
# %idle 空闲的CPU百分比

# 查看平均负载
sar -q 1 3
06:44:25 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
06:44:26 PM         2       842      0.37      0.63      0.78
06:44:27 PM         4       842      0.37      0.63      0.78
06:44:28 PM         3       842      0.37      0.63      0.78
Average:            3       842      0.37      0.63      0.78
# runq-sz  运行队列的长度(等待运行的进程数,每核的CP不能超过3个)
# plist-sz 进程列表中的进程(processes)和线程数(threads)的数量
# ldavg-1 最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值,5分钟和15分钟以此类推
# ldavg-5 最后5分钟的CPU平均负载
# ldavg-15 最后15分钟的CPU平均负载

# 查看内存使用情况
sar -r 1 3
06:45:20 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
06:45:21 PM    738416  15595048     95.48      8324    171104  22171856    108.53
06:45:22 PM    738292  15595172     95.48      8332    171296  22171856    108.53
06:45:23 PM    737796  15595668     95.48      8332    171488  22171856    108.53
Average:       738168  15595296     95.48      8329    171296  22171856    108.53
# kbmemfree  空闲的物理内存大小
# kbmemused  使用中的物理内存大小
# %memused 物理内存使用率
# kbbuffers 内核中作为缓冲区使用的物理内存大小,kbbuffers和kbcached:这两个值就是free命令中的buffer和cache. 
# kbcached 缓存的文件大小
# kbcommit  保证当前系统正常运行所需要的最小内存,即为了确保内存不溢出而需要的最少内存(物理内存+Swap分区)
# commit 这个值是kbcommit与内存总量(物理内存+swap分区)的一个百分比的值

# 查看系统swap分区的统计信息
sar -W 1 3
06:46:15 PM  pswpin/s pswpout/s
06:46:16 PM      0.00      0.00
06:46:17 PM      0.00      0.00
06:46:18 PM      0.00      0.00
Average:         0.00      0.00
# pswpin/s  每秒从交换分区到系统的交换页面(swap page)数量
# pswpott/s 每秒从系统交换到swap的交换页面(swap page)的数量

# 查看I/O和传递速率的统计信息
sar -b 1 3
06:47:29 PM       tps      rtps      wtps   bread/s   bwrtn/s
06:47:30 PM      4.08      0.00      4.08      0.00     32.65
06:47:31 PM      0.00      0.00      0.00      0.00      0.00
06:47:32 PM      0.00      0.00      0.00      0.00      0.00
Average:         1.35      0.00      1.35      0.00     10.77
# tps  磁盘每秒钟的IO总数,等于iostat中的tps
# rtps 每秒钟从磁盘读取的IO总数
# wtps 每秒钟从写入到磁盘的IO总数
# bread/s 每秒钟从磁盘读取的块总
# bwrtn/s 每秒钟此写入到磁盘的块总数

# 磁盘使用详情统计
sar -d -p 1 3
06:48:57 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:48:58 PM  dev252-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
06:48:58 PM dev252-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

06:48:58 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:48:59 PM  dev252-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
06:48:59 PM dev252-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

06:48:59 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:49:00 PM  dev252-0      4.04      0.00     32.32      8.00      0.00      1.00      0.25      0.10
06:49:00 PM dev252-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:     dev252-0      1.34      0.00     10.74      8.00      0.00      1.00      0.25      0.03
Average:    dev252-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
# DEV 磁盘设备的名称,如果不加-p,会显示dev253-0类似的设备名称,因此加上-p显示的名称更直接
# tps:每秒I/O的传输总数
# rd_sec/s 每秒读取的扇区的总数
# wr_sec/s 每秒写入的扇区的 总数
# avgrq-sz 平均每次次磁盘I/O操作的数据大小(扇区)
# avgqu-sz 磁盘请求队列的平均长度
# await 从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒等于1000毫秒),等于寻道时间+队列时间+服务时间
# svctm I/O的服务处理时间,即不包括请求队列中的时间
# %util I/O请求占用的CPU百分比,值越高,说明I/O越慢

# 进程、inode、文件和锁表状态
sar -v 1 3
06:50:52 PM dentunusd   file-nr  inode-nr    pty-nr
06:50:53 PM      3885      3936     10854         6
06:50:54 PM      3885      3904     10854         6
06:50:55 PM      3885      3936     10854         6
Average:         3885      3925     10854         6
# dentunusd 在缓冲目录条目中没有使用的条目数量
# file-nr 被系统使用的文件句柄数量
# inode-nr 已经使用的索引数量 
# pty-nr 使用的pty数量

# 统计网络信息
sar -n [DEV,EDEV,NFS,NFSD,SOCK,IP,EIP,ICMP,EICMP,TCP,ETCP,UDP,SOCK6,IP6,EIP6,ICMP6,EICMP6,UDP6] 1 3
# DEV显示网络接口信息,EDEV显示关于网络错误的统计数据
# NFS统计活动的NFS客户端的信息,NFSD统计NFS服务器的信息,SOCK显示套接字信息,ALL显示所有5个开关
# 它们可以单独或者一起使用

Bat常用命令

在这里插入代码片

数据库

MySQL

安装部署:见官网,略

常用命令

# 查看所有参数
SHOW VARIABLES;

# 缓存相关参数查看,https://www.cnblogs.com/wangyiwei/p/7765457.html
SHOW VARIABLES LIKE '%query_cache%';

# 查看慢查询相关日志
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
# 设置方法
# 1:全局变量设置
SET GLOBAL slow_query_log='ON'; 
SET GLOBAL slow_query_log_file='/usr/local/mysql/data/slow.log';
SET GLOBAL long_query_time=1;
# 2:配置文件设置
# 修改配置文件my.cnf,在[mysqld]下的下方加入,然后重启mysql服务即可
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1

# 查询前100条
SELECT * FROM t_basic_message WHERE is_read = 1 LIMIT 0, 100;

# 显示哪些线程正在运行
SHOW PROCESSLIST; # 显示前100条
SHOW FULL PROCESSLIST; # 显示所有

# kill 进程
kill 1825;

# 显示哪些表的打开的
SHOW OPEN TABLES;
# In_use列表示有多少线程正在使用某张表
# Name_locked表示表名是否被锁,这一般发生在Drop或Rename命令操作这张表时

# 查看服务器状态
SHOW STATUS LIKE '%lock%'

# 查看innodb引擎的运行时信息
SHOW ENGINE INNODB STATUS

# 查看服务器timeout配置
SHOW VARIABLES LIKE '%timeout%'

# 查询正在执行的事务
SELECT * FROM information_schema.INNODB_TRX

# 查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS

# 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS

# 查看下autocommit的值
select @@autocommit;

# 查看数据库的隔离级别:
select @@tx_isolation;

# 查看表是什么时候更新的
SELECT * FROM information_schema.tables WHERE table_schema='test1' AND table_name='rpt_test';

# 查看正在执行的sql
# 方法一:使用processlist,但是有个弊端,就是只能查看正在执行的sql语句,对应历史记录,查看不到。好处是不用设置,不会保存。
use information_schema;
show processlist;
# 或者直接
select * from information_schema.`PROCESSLIST` where info is not null;

# 方法二:开启日志模式
# 1、开启/关闭
SET GLOBAL log_output = 'TABLE';  SET GLOBAL general_log = 'ON';
# SET GLOBAL log_output = 'TABLE';  SET GLOBAL general_log = 'OFF';

# 2、查询
SELECT * from mysql.general_log ORDER BY event_time DESC

# 3、清空表(delete对于这个表,不允许使用,只能用truncate)
# truncate table mysql.general_log;

# 密码复杂度
SHOW VARIABLES LIKE 'validate_password%';
# 密码验证等级
SET GLOBAL validate_password_policy=LOW;
# 密码最小长度限制修改(最小是4)
SET GLOBAL validate_password_length=6;

# 允许远程连接
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

# performance_schema.table_io_waits_summary_by_table
select object_schema, sum(count_read) as count_read, sum(count_write) as count_write from performance_schema.table_io_waits_summary_by_table where object_schema not in ('mysql', 'performance_schema', 'information_schema')  group by object_schema;

mysql监控之:orzdba

MongoDB

Redis

PHP

centos7安装php7

详见

yum -y install gcc

# 安装epel-release
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# 安装PHP7的rpm源
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# 安装php7
yum install php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysql.x86_64 php70w-pdo.x86_64

# 安装php-fpm
yum install php70w-fpm php70w-opcache

# 启动
systemctl start php-fpm
# 开机启动设置
systemctl enable php-fpm
systemctl daemon-reload

# php-fpm重启
kill -USR2 pid
# 或
service restart php-fpm

# nginx配置
server {
    listen       80;
    #server_name  www.test.com;    #需要修改客户端hosts文件
 
    root   /opt/wordpress;    #PHP项目根路径
    index index.php index.html index.htm;
 
    location / {
        try_files $uri $uri/ =404;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
 
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

# 附上官网安装说明
http://php.net/manual/zh/install.unix.nginx.php

PHP服务器性能分析工具:xhprof

# 下载源码
git clone https://github.com/longxinH/xhprof.git ./xhprof

# 编译源码并安装
cd xhprof/extension/
/path/to/php7/bin/phpize
./configure --with-php-config=/path/to/php7/bin/php-config
make && sudo make install

# 在php.ini中添加
[xhprof]
extension = xhprof.so
xhprof.output_dir = /tmp/xhprof

# 安装绘图工具
yum install graphviz

# 在PHP代码入口处添
xhprof_enable();

# 在PHP代码出口处添加
### START ###
# 停止监控
$xhprof_data = xhprof_disable();
# 导入工具包,需注意工具包的位置
include_once "/xhprof_lib/utils/xhprof_lib.php";
include_once "/xhprof_lib/utils/xhprof_runs.php";
# 保存结果到xhprof.output_dir设置的目录
$xhprof_runs = new XHProfRuns_Default();
# save the run under a namespace "xhprof_foo"
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
# 可以将这个打印到日志中,或者直接返回出来,也可以直接到xhprof.output_dir目录下看
echo "---------------http://....../xhprof_html/index.php?run=$run_id&source=xhprof_foo\n".---------------\n";
# 注意:需将xhprof目录下的examples、xhprof_html、xhprof_lib放到合适位置
# examples:是一个示例PHP文件
# xhprof_html:用来展示收集到的性能结果
# xhprof_lib:用来整理性能数据的库
### END ###

# 启动、重启php-fpm,php-fpm -R是以root用户启动,默认不支持

前端笔记

css

css常用样式

table td{
    max-width: 500px;
    word-wrap: break-word;
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}
table td:hover{
    white-space: normal;
    overflow: auto;
}

js/vue

VUE中解决setInterval函数中的this不是指向VUE对象的问题

methods: {
	A() {
		let that = this
		setInterval(function(){
			that.B()
		}, 1000)
	},
	B() {
		console.info('run~')
	}
}

Maven

将pom.xml的文件下载到当前位置

  • 新建一个文件夹,将pom.xml放进去
  • 新建一个bat文件,内容是mvn dependency:copy-dependencies
  • 执行这个bat文件就行
  • 即可下载pom中引用的jar到当前目录的taget目录下

打包跳过测试

mvn clean install -DskipTests
# 或
mvn clean install -Dmaven.test.skip=true

ADB命令

# 查询当前的app
adb shell dumpsys window | findstr mCurrentFocus 

Git命令

# git删除master分支,很危险
git branch -D master
# 把当前分支设置为matser分支
git checkout -b master 

Excel

excel常用函数

# 时间相减得小数日期
=TEXT((VALUE(O20)-VALUE(L20))*24,"0.0")

# 时间戳转换为时间
=TEXT((C4/1000+8*3600)/86400+70*365+19,"yyyy-mm-dd hh:mm:ss")

# v-lookup

TCP/IP

TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG)

在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

其中,对于我们日常的分析有用的就是前面的五个字段。

它们的含义是:

SYN表示建立连接,

FIN表示关闭连接,

ACK表示响应,

PSH表示有 DATA数据传输,

RST表示连接重置。

其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,

如果只是单个的一个SYN,它表示的只是建立连接。

TCP的几次握手就是通过这样的ACK表现出来的。

但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。

RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。

一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。

PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。

TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。

概念补充-TCP三次握手:

TCP(Transmission Control Protocol)传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。


在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.

其他

C语言格式字符串

printf("Hello,my name is %s,i am %d years old\n", name, age);

Python格式字符串

print("Hello,my name is %s,i am %d years old\n" % (name, age));

浏览器证书导入(Gatling、Jmeter之类的)

应该导入到受信任的证书颁发机构中,导入之后如果没效果的话需要重启一下(反正Chrome需要重启,Firefox貌似不用)>>>

kafka相关

安装部署

# 复制zookeeper的zoo_sample.cfg配置为zoo.cfg
# 根据需要进行配置

# 配置kafka的server.properties
# 根据需要进行log地址及线程配置
# 以下行放开注释并配置地址
listeners=PLAINTEXT://本机ip:9092
# 设置为false,不让程序自动创建topic,就是程序再往kafka生产数据的时候,如果发现topic不存在就会自动创建。**加粗样式**
auto.create.topics.enable=false
# 设置为true,删除topic的同时,会过一段时间删除目录和对应数据文件目录。
delete.topic.enable=true

# 配置公网访问(关闭listeners的配置,使用下面这个)
advertised.listeners=PLAINTEXT://49.234.13.92:9092

# windows zookeepe启动
.\bin\zkServer.cmd
# windows kafka启动
.\bin\windows\kafka-server-start.bat .\config\server.properties
# linux差不多,执行对应sh文件

Kafka的集群管理工具AdminClient
创建Topic:createTopics(Collection<NewTopic> newTopics)
删除Topic:deleteTopics(Collection<String> topics)
显示所有Topic:listTopics()
查询Topic:describeTopics(Collection<String> topicNames)
查询集群信息:describeCluster()
查询ACL信息:describeAcls(AclBindingFilter filter)
创建ACL信息:createAcls(Collection<AclBinding> acls)
删除ACL信息:deleteAcls(Collection<AclBindingFilter> filters)
查询配置信息:describeConfigs(Collection<ConfigResource> resources)
修改配置信息:alterConfigs(Map<ConfigResource, Config> configs)
修改副本的日志目录:alterReplicaLogDirs(Map<TopicPartitionReplica, String> replicaAssignment)
查询节点的日志目录信息:describeLogDirs(Collection<Integer> brokers)
查询副本的日志目录信息:describeReplicaLogDirs(Collection<TopicPartitionReplica> replicas)
增加分区:createPartitions(Map<String, NewPartitions> newPartitions)

Connection timed out和Connection refused的区别

转自
前言:这两个异常报出的时候,说明客户端没法正常连接到服务端,但是两者还是有区别的。
1:Connection timed out
当得到 Connection timed out: connect 的时候表示TCP路由不正常,原因有很多,可能是服务器无法ping通,可能是服务器(防火墙等)丢弃了该请求报文包,也可能是服务器应答太慢,又或者存在间歇性的问题(这种情况很难从日志文件中排查问题)。
2:Connection refused
当得到Connection refused: connect 异常的时候表示从本地客户端到目标IP地址的路由是正常的,但是该目标端口没有进程在监听,然后服务端拒绝掉了连接。
一个成功的tcp链接将会看到Syn,Syn-Ack,Ack,这也就是我们预期的TCP三次握手。当使用tcpdump或wireshark抓包工具来探测发送过来的请求报文包时,Connection refused将会看到Syn,Rst。

NTP时钟同步配置

服务端:
service ntpd start

$ vim /etc/ntp.conf

//将这行给注释
# restrict default nomodify notrap nopeer noquery      
 
//然后添加这两行 ,意思是 允许IPV4 IPV6 查询 拒绝修改
restrict -4 default kod notrap nomodify    
restrict -6 default kod notrap nomodify
 
//添加修改上层时间服务器,如果能联通外网,则不需要修改,
server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
server 2.rhel.pool.ntp.org iburst
server 3.rhel.pool.ntp.org iburst
//如果联不通外网,则把上面几行注释,然后添加下面两行,意思是设置成时间服务器是自己
server 127.127.1.0
fudge 127.127.1.0 stratum 8

客户端
service ntpd start

$ vim /etc/ntp.conf
server    192.168.10.20    iburst

同步时间:ntpdate 192.168.10.20

vim

vim scala配置高亮

$ 第一步,执行下面这个脚本
$ mkdir -p ~/.vim/{ftdetect,indent,syntax} && for d in ftdetect indent syntax ; do curl -o ~/.vim/$d/scala.vim https://raw.githubusercontent.com/gchen/scala.vim/master/scala.vim; done

# 第二步,在~/.vimrc中添加(文件不存在则创建)
$ syntax on

解决vim中粘贴,注释很乱的问题

:set paste
posted @ 2020-08-04 16:59  飞_2016  阅读(418)  评论(0编辑  收藏  举报