Linux百科书
前言
记录小知识 , 持续更新
1.设置路由,同时上内外网
route print # 发现两条0.0.0.0路由(内外网)
route delete 0.0.0.0
route add 0.0.0.0 mask 0.0.0.0 192.168.43.1 # 默认路由外网
route -p add 134.80.0.0 mask 255.255.254.0 134.80.6.1 # 内网段走内网路由
2.lvm 根分区扩容 及 正常挂载
# lvm根分区扩容
lvdisplay/vgdisplay 查看lvm信息 如果vg剩余free容量则可以直接扩容
1.添加新的硬盘
2.fdisk 将新的新盘分区(m--n) 且将新分区类型改为lvm(m--t-->8e)
3.fdisk -l 查看新分区
4.partprobe /dev/sdb 重新读取分区表信息
5.pvcreate /dev/sdb1 创建物理卷
6.vgextend /dev/centos /dev/sdb1 扩展vg
7.lvextend -L +20G /dev/centos/root 扩展lvm(根分区)
lvextend -l +100%FREE /dev/centos/root vg所有空间给到lv
8.xfs_growfs /dev/centos/root 扩展分区 (如果是ext文件格式用resize2fs扩展)
# 创建其他挂载点,前3步不变
4.vgcreate vg_name /dev/vda3 创建vg
5.lvcreate -L +100G -n lv_name vg_name 创建lv
6.mkfs.ext4 lv_name(一般为/dev/vg_name/lv_name) 格式化lv xfs格式化用mkfs.xfs
7.mkdir /data 创建挂载目录
8.mount /dev/vg_name/lv_name /data lv挂载到目录
9.blkid 查找到lv的UUID
10.vim /etc/fstab (可参考源文件格式)
格式:UUID 挂载点 文件系统格式 defaults 0 0
11.mount -a 加载/etc/fstab文件
3.java应用主机cpu负载过高,异常定位
1.通过执行top查看占用cpu最高的进程,PID。
2.然后通过top -H -p PID 命令打印该PID进程下哪个线程的CPU占用比较高,用于下面转换16进制,tid。
3.通过printf "%x\n" tid 将占用cpu最高的线程进行16进制转换,为后面查找 jstack 日志做准备,id
4.jstack PID |grep id -A 30 打印线程的堆栈信息 ,jstack是jdk自带的工具,在jdk bin目录下,该工具一般在cpu比较高的时候做dump用。
一般在windows上对于cpu异常情况通过procdump做dump进行分析。
procdump -ma -c 50 -s 3 -n 2 5844(Process Name or PID)
-ma 生成full dump, 即包括进程的所有内存. 默认的dump格式包括线程和句柄信息.
-c 在CPU使用率到达这个阀值的时候, 生成dump文件.
-s CPU阀值必须持续多少秒才抓取dump文件.
-n 在该工具退出之前要抓取多少个dump文件.
4.Linux中的特殊权限
文件权限除r,w,x以外还包含s,t两个特殊权限
SUID :
chmod u+s XXXX (或者chmod 4755 XXXX ,其中4:SUID,755:ugo)
1)仅对二进制程序有效
2)执行者对该程序有x的可执行权限
3)执行权限仅在该执行过程中有效
4)执行者将具备拥有者的权限
方便其他用户临时获取当前文件的执行权限,典型命令/usr/bin/passwd
SGID:
chmod g+s XXXX (或者chmod 2755 XXXX ,其中2:SGID,755:ugo)
1)对二进制程序和目录有效
2)用户若对此目录有人r,x权限,该用户能进入该目录
3)该用户在此目录下的有效用户组变成该目录的用户组
4)用户如具备w权限,用户创建的新文件的用户组和此目录用户组相同
登陆用户所在用户组被无视,以当前目录设定用户组为准
SBIT:
chmod o+t XXXX (或者chmod 1755 XXXX ,其中1:SBIT,755:ugo)
1)仅对目录有效
2)用户若对此目录拥有w,x权限,即拥有写的权限
3)当前用户在此目录下创建的文件和目录,仅自己与root可以删除。
参考/tmp,主要对用户数据实行写保护,方便数据同一目录下收集。
5.简述raid0 raid1 raid5 三种工作模式的工作原理及特点
RAID,可以把硬盘整合成一个大磁盘,还可以在大磁盘上再分区,放数据还有一个大功能,多块盘放在一起可以有冗余(备份)
RAID 0 全盘0 RAID0_All,一个数据两个硬盘同时读写,至少需要两块硬盘。
优点:读写速率高
缺点:不支持容错,不提供冗余机制
RAID 0 单盘0 RAID0_Single,只需要一块盘,读写速率快,不支持容错,不提供冗余机制。
RAID 1 镜像卷,一个数据在两块硬盘里写,只能2块硬盘。
优点:支持冗余
缺点:读写速率一般,使用率为50%,成本高
RAID 5 需要3块硬盘及以上,分布式奇偶校验的独立磁盘结构,它的奇偶校验码存在于所有磁盘上。任何一个硬盘损坏,都可以根据其它硬盘上的校验位来重建损坏的数据(最多允许1块硬盘损坏)空间使用率为2块硬盘空间。支持容错。
RAID 10是RAID0与RAID1综合应用。
冗余从好到坏:RAID1 RAID10 RAID5 RAID0
性能从好到坏:RAID0 RAID10 RAID5 RAID1
成本从低到高:RAID0 RAID5 RAID1 RAID10
6.bound配置
1. 接口配置文件
[root@install network-scripts]# cat ifcfg-bond0
DEVICE=bond0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPADDR=172.16.8.100
PREFIX=24
IPV6INIT=no
USERCTL=no
GATEWAY=172.16.8.254
[root@install network-scripts]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPV6INIT=no
USERCTL=no
MASTER=bond0
SLAVE=yes
[root@install network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPV6INIT=no
USERCTL=no
MASTER=bond0
SLAVE=yes
2. bonding参数
[root@install ~]# tail -2 /etc/modprobe.d/bond0.conf
alias bond0 bonding
options bonding mode=0 miimon=100
3. 重启网络服务
[root@install ~]# service network restart
ethtool bond0 查看speed变为2000Mb/s
4. 添加路由:route add default gw 网关ip
添加DNS:vim /etc/resov.conf ---→ nameserver 8.8.8.8
7.linux中环境变量HISTCONTROL可以控制历史的记录方式
HISTCONTROL有以下的选项:
ignoredups 默认,忽略重复命令
ignorespace 忽略所有一空格开头的命令
ignoreboth ignoredups 和 ignorespace 的组合
erasedups 删除历史记录中重复命令,相同的指令仅保留最近的一个
export HISTCONTROL=ignorespace:erasedups #多个选项 ":"隔开
8.文件系统损坏
开机界面到Give root pasaword for maintenance -----------Type Control-D to continue
fsck /dev/sda2 # 修复磁盘 只适用于ext4文件系统
reboot # 重启
touch文件时显示 cannot touch ‘xxxxx’:Read-only file system
fsck.ext4 -fy /dev/sdb1 # 修复磁盘 修复前先umount
XFS文件系统修复
xfs_repair /dev/sda1 # 修复xfs文件 修复前先umount
9.网卡配置文件
DEVICE=eth0
ONBOOT=yes
NETBOOT=yes
BOOTPROTO=dhcp/none # dhcp自动获取ip,none手动配置ip
TYPE=Ethernet
IPADDR=XXX # IP地址
NETMASK=255.255.255.0 # 子网掩码,可以使用PREFIX=24
GATEWAY=XXX # 外网必须写网关
HWADDR=00:50:56:b2:xx:xx # MAC地址
DNS1=114.114.114.114
DNS2=8.8.8.8
10.Linux内核调优
# 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5。对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接
net.ipv4.tcp_syn_retries = 1
# 对于远端的连接请求SYN,内核会发送SYN + ACK数据包,以确认收到上一个SYN连接请求包。这是所谓的三次握手的第二个步。不应该大于255,默认值是5
net.ipv4.tcp_synack_retries = 1
# TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。防止两边建立连接但不发送数据的攻击。默认值7200
net.ipv4.tcp_keepalive_time = 600
# 探测消息未获得响应时,重发该消息的间隔时间(秒)。默认值为75
net.ipv4.tcp_keepalive_intvl =15
# 在丢弃已建立的TCP连接之前﹐需要进行多少次重试,可根据网络情况适当减小,默认值15
net.ipv4.tcp_retries2 = 5
# 对于服务端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间,默认为60
net.ipv4.tcp_fin_timeout = 2
# 系统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息,这个限制可以防止Dos攻击。默认值180000
net.ipv4.tcp_max_tw_buckets = 36000
# 打开快速 TIME-WAIT sockets 回收。默认值0
net.ipv4.tcp_tw_recycle = 1
# 允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。默认值0
net.ipv4.tcp_tw_reuse = 1
# 系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。默认值8192
net.ipv4.tcp_max_orphans = 32768
# 对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。默认值1024
net.ipv4.tcp_max_syn_backlog = 16384
# 发送缓存设置。min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4096(4K)。default:为TCP socket预留用于发送缓冲的内存数量。默认值16384。max: 用于TCP socket发送缓冲的内存最大值。默认值131072
net.ipv4.tcp_wmem = 8192 131072 16777216
# 接收缓存设置。同发送缓存设置
net.ipv4.tcp_rmem = 32768 131072 16777216
# low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。即低于此值没有内存压力。(理想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配 - 这第 2 个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 ) pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 ) high:允许所有tcp sockets用于排队缓冲数据报的页面量。(如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的原因了。 在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;或者使现有连接能够传输 2.5 倍的数据。 我的网络里为192000 300000 732000) 一般情况下这些值是在系统启动时根据系统内存数量计算得到的。
net.ipv4.tcp_mem = 786432 1048576 1572864
# 表示用于向外连接的端口范围。默认值32768-61000
net.ipv4.ip_local_port_range = 1024 65000
# 系统支持的最大ipv4连接数。默认值65536
net.ipv4.ip_conntrack_max = 65536
# 防火墙限制,系统支持的最大ipv4连接数。默认值65336
net.ipv4.netfilter.ip_conntrack_max=65536
# 已建立的tcp连接的超时时间,默认值43200
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
# 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。默认值128
net.core.somaxconn = 16384
# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。默认值1024
net.core.netdev_max_backlog = 16384
这些参数为一般常见调优参数。具体优化值要参考应用场景,是否适合。
11.tomcat调优
<Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="200"
acceptCount="900"
disableUploadTimeout="true"
connectionTimeout="20000"
URIEncoding="UTF-8"
enableLookups="false"
redirectPort="8443"
compression="on"
compressionMinSize="1024"
compressableMimeType="text/html,text/xml,text/css,text/javascript"/>
参数说明:
org.apache.coyote.http11.Http11NioProtocol:调整工作模式为Nio
maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。
minSpareThreads:最小空闲线程数。
maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。
acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。
disableUploadTimeout:禁用上传超时时间
connectionTimeout:连接超时,单位毫秒,0代表不限制
URIEncoding:URI地址编码使用UTF-8
enableLookups:关闭dns解析,提高响应时间
compression:启用压缩功能
compressionMinSize:最小压缩大小,单位Byte
compressableMimeType:压缩的文件类型
12.mysql对比工具mysqldiff
mysqldiff是mysql官方推荐的库对比工具,MySQL Utilities中的一个脚本。可以比对两个库中缺少的表,相同的表缺少的字段。
mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1.object1:db2.object1 db3:db4
这里讲的是两种用法。可以直接对比库,db3:db4 ,也可以对比表 db1.table1:db2.table2
--server1:配置server1的连接。
--server2:配置server2的连接。
--character-set:配置连接时用的字符集,如果不显示配置默认使用character_set_client。
--width:配置显示的宽度。
--skip-table-options:保持表的选项不变,即对比的差异里面不包括表名、AUTO_INCREMENT、ENGINE、CHARSET等差异。 这个一定要加,否则肯定对比失败。测试环境和正式环境自增字段的当前值肯定不一样。如果是主从对比,就不要加。
-d DIFFTYPE,--difftype=DIFFTYPE:差异的信息显示的方式,有 [unified|context|differ|sql],默认是unified。如果使用sql,那么就直接生成差异的SQL,这样非常方便。
--changes-for=:修改对象。例如 –changes-for=server2,那么对比以sever1为主,生成的差异的修改也是针对server2的对象的修改。
--show-reverse:在生成的差异修改里面,同时会包含server2和server1的修改。
--force:完成所有的比较,不会在遇到一个差异之后退出
-vv:便于调试,输出许多信息
-q:quiet模式,关闭多余的信息输出
数据库对比:
mysqldiff --server1=:xxx:xxx@xxx.xxx.xxx.xxx:3306 --server2=lxxx:lixxx@xx.xx.xx.xx:3306 --changes-for=server1 --skip-table-options --force db1:db2
13.mysql调优
参数 | 默认值 | 建议值 | 介绍 |
---|---|---|---|
back_log | 50 | 500 | back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。也就是说,如果MySql的连接数据达到max_connections时,新来的请求将会被存在堆栈中。back_log值不能超过TCP/IP连接的侦听队列的大小。默认值50修改为500.(每个连接256kb,占用:125M) |
wait_timeout | 28,800 | 1800 | MySQL客户端的数据库连接闲置最大时间值。就是当你的MySQL连接闲置超过一定时间后将会被强行关闭。单位:秒。如果出现“Too many connections”的错误,可用show processlist查看数据库连接,如果经常发现MYSQL中有大量的Sleep进程,则需要 修改wait-timeout值了。 |
max_connections | 151 | 3000 | max_connections是指MySql的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值。介于MySql会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值。 |
thread_concurrency | 8 | 64 | cpu亲和性设置,类似于nginx的worker_processes。thread_concurrency应设为CPU核数的2倍. 比如有一个双核的CPU, 那thread_concurrency 的应该为4 |
innodb_buffer_pool_size | 128M | InnoDB表性能影响最大的一个参数。 如果一台机器只有mysql且为InnoDB引擎,可设置为主机内存的75%。可以通过 (Innodb_buffer_pool_read_requests – Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 计算缓存命中率,并根据命中率来调整 innodb_buffer_pool_size 参数大小进行优化。值可以用以下命令查:show status like ‘Innodb_buffer_pool_read%’; | |
innodb_additional_mem_pool_size | 8M | 置了InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,所以当我们一个MySQL Instance中的数据库对象非常多的时候,是需要适当调整该参数的大小以确保所有数据都能存放在内存中提高访问效率的。根据MySQL手册,对于2G内存的主机,推荐值是20M,32G内存的推荐 100M | |
innodb_log_buffer_size | 8M | InnoDB存储引擎的事务日志所使用的缓冲区。类似于Binlog Buffer,InnoDB在写事务日志的时候,为了提高性能,也是先将信息写入Innofb Log Buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件 (或者同步到磁盘)中。可以通过innodb_log_buffer_size 参数设置其可以使用的最大内存空间。一般来说不建议超过32M。 innodb_flush_log_trx_commit参数对InnoDB Log的写入性能有非常关键的影响,默认值为1。该参数可以设置为0,1,2,解释如下: 0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作; 1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步; 2:事务提交会触发log buffer到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作 | |
query_cache_size | 32M | 主要用来缓存MySQL中的ResultSet,也就是一条SQL语句执行的结果集,所以仅仅只能针对select语句。当打开了 Query Cache功能,MySQL在接受到一条select语句的请求后,MySQL会直接根据预先设定好的HASH算法将接受到的select语句以字符串方式进行hash,然后到Query Cache中直接查找是否已经缓存,如果缓存,该select请求就会直接将数据返回。 Query Cache也有一个致命的缺陷,那就是当某个表的数据有任何任何变化,都会导致所有引用了该表的select语句在Query Cache中的缓存数据失效。所以,当我们的数据变化非常频繁的情况下,使用Query Cache可能会得不偿失。 Query Cache的使用需要多个参数配合,其中最为关键的是query_cache_size和query_cache_type,前者设置用于缓存 ResultSet的内存大小,后者设置在何场景下使用Query Cache。可以通过计算Query Cache的命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))来进行调整。 query_cache_type可以设置为0(OFF),1(ON)或者2(DEMOND),分别表示完全不使用query cache,除显式要求不使用query cache(使用sql_no_cache)之外的所有的select都使用query cache,只有显示要求才使用query cache(使用sql_cache)。如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲. 如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小。 | |
TABLE_CACHE | 512 | table_cache指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。 | |
thread_cache_size | 64 | 服务器线程缓存。这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能。建议根据主机内存来设置:1G 设置为8,2G设置为 16,3G设置为32 ,3G以上设置为64 |
14. vim 去掉自动注释和自动回车
去掉
:set paste
恢复
:set paste!
15.Linux、AIX系统修改用户密码过期时间
Linux:
查看用户的过期时间:
chage -l ampdcp
绕过密码策略修改密码:
echo 'shsnc!@#'|passwd --stdin ampdcp
密码不过期:
sudo chage -M 99999 ampdcp
AIX :
脱离密码复杂度策略
pwdadm -c ampdcp
修改最大有效日期:
chuser maxage=0 ampdcp
失败登录记录
chsec -f /etc/security/lastlog -s ampdcp -a unsuccessful_login_count=0
查询用户maxage
lsuser -a maxage ampdcp
16.su与su -区别
su $USER 用户切换
su - $USER 用户切换,并读取用户环境变量