常见问题

一、在linux中大致分为两种一种是【标准输出】,另一种为【标准错误】,应用中的区别可以理解为,【标准错误】不能使用文本处理命令,如grep sed awk等

实例:nginx -V,输出结果保存在文本中,nginx -V 2> /tmp/nginx.info中

二、优化Nginx服务的worker进程个数小于cpu核数,

例如一台2颗物理CPU 每个CPU的核数为4核 ;计算结果就是8*2 =16 (为worker_processes XX)

worker_connections 24576;**24核乘以每核可承载1024连接数

但为了防止nginx将cpu吃满,会保留一部分CPU空间

如:2颗cpu,每个cpu核数为4核,计算为8核

8核cpu,开启6个进程

worker_processes 6;

worker_cpu_affinity 10000000 01000000 00100000 00010000 00001000 00000100;

worker_connections 6x1024;

三、tomcat中JVM查看内存溢出

在catalina.out中是不显示具体的io线程

内存溢出后排查分析:

1、通过命令查看对应的进程号 比如:jps 或者 ps -ef | grep servicemix

2、输入命令查看gc情况 命令:jstat -gcutil 进程号 刷新的毫秒数 展示的记录数

比如:jstat -gcutil 14050 1000 10 (查看进程号14050,每隔1秒获取下,展示10条记录)

3、查看具体占用情况:

(1)命令: jmap -histo 进程号 | more (默认展示到控制台)

(2)命令: jmap -histo 14050 | more > exceptionlog.txt (输出到当前目录的exceptionlog.txt文件)

比如:jmap -histo 14050 | more 查看具体的classname,是否有开发人员的类,也可以输出到具体文件分析

四、jenkins上传war到tomcat时,需要重启tomcat,才能触发tomcat自动解压,或者进行reload ,再或者在server.xml下进行配置自动加载

五、查看MySQL的线程运行情况

1.使用top命令查看cpu使用率

2.使用管理员用户运行命令:

mysql> show [full] processlist; # full是可选的,如果不加,默认只显示前100条结果。

【可以靠这个结果来分析一些诸如用户连接状况之类的信息。譬如我当初用Navicat去连公司的远程数据库服务器,出现如下报错:

Lost connection to MySQL server at ‘waiting for initial communication packet’, system error: 0

经查阅资料,发现在以IP地址连接MySQL时,MySQL默认会通过该地址去解析访问者的主机名。如果没有配置DNS等服务,就会在不断尝试解析的过程中超时,造成上面的错误。简单的解决办法是在MySQL服务器的 /etc/hosts 中添加一条访问者的 IP<>主机名 映射,这样就能正确解析出主机名,完成数据库连接。

只是我公司的内网环境复杂,在没有网管人员协助的情况下,难以定位最终的访问IP。这时就可以通过 show [full] processlist; 实时追踪线程来分析出正确的IP地址。】

可以看到具体的SQL语句执行耗费了较长时间。

1)优化sql语句,做索引

2)做缓存

3.修改mysql配置文件中的pool/buffer等数值

4.使用explain分析SQL语句

【主select对上万条记录使用filesort进行了排序,这是造成查询速度慢的原因。然后多个并发的查询使CPU专用很高。】

5.优化

1)缩减查询范围

2)发现有一定效果,但效果不明显,原因是每条记录都要做一次DATEDIFF运算

3)查询速度大幅提高。在PHP中,日期阈值通过计算得到

或者:注释掉sql查询语句

mysql IO线程 100%的实例分析【写入IOPS很高】

分析过程:

1、通过iotop工具可以看到当前IO消耗最高的mysql线程

2、查看具体的线程【49342】的堆栈,可以看到正在进行redo log的刷新,对应的是9号文件

3、9号文件对应的是redo log的第一个文件

为什么mysql进程会频繁的刷新redo log文件,要结合redolog的刷盘策略来分析,关键是innodb_flush_log_at_trx_commit参数,

默认是1,最安全,但在写压力大的情况下,也会带来较大的性能影响,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去。

结合这个集群的写入场景来看,大部分都是小事务的写入,每次事务提交都会触发刷盘动作,这种场景下通过增大innodb_log_buffer_size和innodb_log_file_size的优化效果不明显

【优化方案】

1、应用层面,对于写压力大的系统,可以将单条的insert语句优化为小批量的insert语句,这样事务commit的次数减少,redo log刷盘减少,性能理论上会有提升

2、MySQL层面,对于日志类型的系统,如果允许宕机的情况下少量数据丢失,可以将innodb_flush_log_at_trx_commit参数调整为2,

当设置为2时,则在事务提交时只做write操作,只保证写到系统的page cache,因此实例crash不会丢失事务,但宕机则可能丢失事务

在这台服务器上测试,将参数调整为2时,IO的请求从200M/S降到约10M/S压力会减少10倍以上

3、系统层面,更换性能更佳的磁盘

六、redis哨兵模式所用到的协议

用流言协议(gossip protocols)来接收关于Master是否下线的信息,并使用投票协议【共识协议】(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。

七、生产环境中重启nginx命令,reload【加载】

八、LVM:VG–》PV----》LV,文件系统相同的才可以做lvm

九、egrep和grep的区别:一个支持扩展正则,一个不支持

十、redis和mysql的区别:非关系型和关系型,

非关系型:一般以key的形式存储在内存中

关系型:一般以表格的形式存在硬盘中,

Innodb引擎:支持事务【原子性,隔离性,一致性,持久性】,主外键,缓存真实数据

MyISAM引擎:不支持事务,不支持主外键,不缓存真实数据

十一、nginx 80转443端口:rewrite ^(.*)$ https://${server_name}$1 permanent;

十二、zabbix自带的基础监控的模板中只有对单核cpu负载1分钟、5分钟、15分钟的监控。

添加对总的cpu负载的监控

key:system.cpu.load[all,avg1] 1分钟cpu总的负载

自动发现主机一般不在生产环境上使用,还有jenkins上线时一般也是一个一个上线

报警信息

主机: node1

时间: 2019.08.07 12:07:12

级别: High

触发: none-nginx-status

详情: nginx-status:web.page.perf[192.168.65.129,index.html,80]:0.000444

状态: OK

项目:web.page.perf[192.168.65.129,index.html,80]

事件ID:1514

十三、keepalive有三个条件可以触发主备切换:

1、停keepalived服务时发生切换;

2、如果是双网卡,停掉其中一块网卡发生切换:

track_interface {

eth0

eth1

}

3、http,ftp,mysql 等应用程序中如查应用程序出现故障时,可以用 vrrp_script 来监控集群资源

十四、iptables时监控流量比如80端口

统计数据包

iptables -nvL |grep -E ‘(dpt|spt):80$’

0 0 ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

0 0 ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 tcp spt:80

流量过大的时候

增加带宽,增加机器

为啥是0.0.0.0/0 0.0.0.0/0?

因为是自定义链,查看自定义链就有具体的规则 【iptables -S 查看编写规则的源命令】

十五、k8s集群扩容master节点?

master扩容需要解决方案,扩容达到个数必须单数个(1.3.5.7…),一般都用keepalived加haproxy作为前端调度,还需要导出kubeinitconfig文件做修改再添加

服务起来之后,容器就退出了?

加一个不以守护进程方式运行的参数

节点出现notready时

首先用kubectl describe 查看容器日志

1.防火墙 安全策略

2.node组件问题

3.认证信息问题

十六、session问题是怎么解决的?

ip_hash:可以实现会话保持,将同一客户的IP调度到同一样后端服务器,可以解决session的问题,不能使用weight

做session共享,不然再次点击网页会发生跳转,数据丢失,重新输入

十七、tomcat有4台,那你filebeat有几台呢?一般用的时候需要修改filebeat配置或者直接用logstash修改配置

tomcat filebeat logsach 是一个用户吗?没有特别的权限设置不是一个

filebeat多久抓取一次?默认的10秒

filebeat占用cpu过大时,合理的配置日志文件的匹配规则,限制单行日志大小,根据实际情况配置memqueue缓存的个数,才能在实际使用中规避filebeat的内存占用过大的问题。【在容器中遇到的问题较多】

十八、ELK压力过大时,

logstash优化:

pipeline 线程数小于CPU内核数

output 线程数小于pipeline线程数

1)定期清理索引

2)优化各个组件

十九、物理机8G JVM 不超过物理内存的一半

物理机 6核 32G 1T 做虚拟机

二十、数据库:双主(AB)的情况下,当连续的数据存到A库,受到网络问题,A库的数据并没有同步到B库中,连续的数据没有继续存到A库,而是直接存到了B库,导致了数据不同步

待答…

主从延迟问题

二十一、灰度发布是如何做划分的,用户?地域?

二十二、ELK kafka的作用,做存储,做削峰,做耦合

二十三、keepalived数据丢失问题【数据库高可用容灾】

解决方法

1 人工修复这部分数据,数量多的话重做主从

2 将sync_binlog改为1,杜绝这个情况再次发生

设置sync_binlog=1,多个事务同时提交,同样很大的影响MySQL和IO性能 安全性高,但消耗性能

二十四、linux磁盘满了处理方式

1.确认是否真的是磁盘空间不足

df -ih 查看磁盘信息

删除占用空间大,且无用的文件(日志)

2.定位最大文件目录

在/下执行du -h max-depth=1 寻找当前目录,哪个文件夹占用空间最大

3.定位最大文件

ls –lhS 将文件以从大到小顺序展现

4.确认文件未被占用(进程被占用时,删除无效,只有杀掉进程才可以被释放)

你可能感兴趣的:(常见问题)