寻觅生命中的那一片浅草......

lsiutil设置磁盘带宽

1. 问题

DELL R410自带RAID卡是SAS6IR,机械盘接上去带宽是3G,而SSD,无论是三星还是闪迪,都只有1.5G,查看指令

./lsiutil -p1 -a 69,8,21,4,0,0

有问题的结果,其中1.5处为接SSD的端口

SAS1068E's links are 3.0 G, 3.0 G, 3.0 G, 1.5 G, off, off, off, off

2. 解决

2.1 方法一

换个RAID卡,如 PERC 6i或者H700,贵

2.2 方法二

换pcie口的SSD,价格是sata口的两倍,贵

2.3 方法三

可以通过lsiutil(要求Version 1.62或以上)设置磁盘的带宽,此机接了4个盘,所以,具体设置,请根据实际情况选择

[root@localhost src]# ./lsiutil -p1 -a 69

LSI Logic MPT Configuration Utility, Version 1.63, June 4, 2009

1 MPT Port found

     Port Name         Chip Vendor/Type/Rev    MPT Rev  Firmware Rev  IOC
 1.  /proc/mpt/ioc0    LSI Logic SAS1068E B3     105      00192f00     0

Main menu, select an option:  [1-99 or e/p/w or 0 to quit] 69

Seg/Bus/Dev/Fun    Board Name       Board Assembly   Board Tracer
 0   2   0   0     SAS6IR                                            

# 输入13进行操作
Main menu, select an option:  [1-99 or e/p/w or 0 to quit] 13  

# 以下3行,直接回车即可
SATA Maximum Queue Depth:  [0 to 255, default is 8] 
Device Missing Report Delay:  [0 to 2047, default is 0] 
Device Missing I/O Delay:  [0 to 255, default is 0] 

PhyNum  Link      MinRate  MaxRate  Initiator  Target    Port
   0    Enabled     1.5      3.0    Enabled    Disabled  Auto
   1    Enabled     1.5      3.0    Enabled    Disabled  Auto
   2    Enabled     1.5      3.0    Enabled    Disabled  Auto
   3    Enabled     1.5      3.0    Enabled    Disabled  Auto
   4    Disabled    1.5      3.0    Enabled    Disabled  Auto
   5    Disabled    1.5      3.0    Enabled    Disabled  Auto
   6    Disabled    1.5      3.0    Enabled    Disabled  Auto
   7    Disabled    1.5      3.0    Enabled    Disabled  Auto

# 此处选择3,是我们接SSD的位置
Select a Phy:  [0-7, 8=AllPhys, RETURN to quit] 3
# 直接回车
Link:  [0=Disabled, 1=Enabled, default is 1] 
# 设置最小带宽,关键操作,选择1
MinRate:  [0=1.5 Gbps, 1=3.0 Gbps, default is 0] 1
# 以下4行,直接回车
MaxRate:  [0=1.5 Gbps, 1=3.0 Gbps, default is 1] 
Initiator:  [0=Disabled, 1=Enabled, default is 1] 
Target:  [0=Disabled, 1=Enabled, default is 0] 
Port:  [0 to 7 for manual config, 8 for auto config, default is 8] 

PhyNum  Link      MinRate  MaxRate  Initiator  Target    Port
   0    Enabled     1.5      3.0    Enabled    Disabled  Auto
   1    Enabled     1.5      3.0    Enabled    Disabled  Auto
   2    Enabled     1.5      3.0    Enabled    Disabled  Auto
   # 注意看下面一行,MinRate为3.0代表设置正确
   3    Enabled     3.0      3.0    Enabled    Disabled  Auto
   4    Disabled    1.5      3.0    Enabled    Disabled  Auto
   5    Disabled    1.5      3.0    Enabled    Disabled  Auto
   6    Disabled    1.5      3.0    Enabled    Disabled  Auto
   7    Disabled    1.5      3.0    Enabled    Disabled  Auto

# 以下4行,直接回车
Select a Phy:  [0-7, 8=AllPhys, RETURN to quit] 
Persistence:  [0=Disabled, 1=Enabled, default is 1] 
Physical mapping:  [0=None, 1=DirectAttach, 2=EnclosureSlot, default is 2] 
Number of Target IDs to reserve:  [0 to 32, default is 8] 

# 输入0退出设置
Main menu, select an option:  [1-99 or e/p/w or 0 to quit] 0

经过以上设置,重启系统,再次确认,带宽已经变为3,cp大量小文件,性能也提升了50%

参考资料

https证书链

应同事要求,把git的地址修改成了https,应用后,浏览器访问是正常的,但git命令行访问时,偶尔会提示证书有问题:

Peer certificate cannot be authenticated with known CA certificates

遇到一两个反馈,就让他们禁用证书检查,或者改用ssh,但反馈多了,觉得这体验的确不够好,虽然安全和方便二者不可兼得,但我们这明明是Symantec颁发的权(mian)威(fei)证书,理论上不应该有问题才对。今天有空,就试着解决下。

犹记得(多么熟悉的三个字,其实是代表了年纪大)上次内网某https应用,有位同事用Chrome访问,死活都提示证书有问题,但其他人又正常,百思不得骑姐。后来是web同事发现并解决了问题,说是证书链不完整,去把中间证书下载回来,加到证书里就解决了。

本次估计也是,但怎么验证?如果是外网,直接用ssllabs_https_check,会打印完整证书链,将网站打印出来的证书和服务器上配置的进行对比,如果不一致,则证明少了中间证书。但我们是内网啊,这网站无法访问到,这时只能放狗+祭出openssl神器了。

查看证书

openssl s_client -showcerts -connect git.example.com:443 -servername git.example.com

Certificate chain节内容,如果下面的开头和结束只出现1次,则代表证书不完整

-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----

至此,我们证实了只有1个证书了,那怎么加入中间证书?

  • 颁发机构一般有提供的
  • 如果当时的压缩包已经不知去向,如果你有2个https应用都是同一个CA颁发的,那么可以用上面openssl的方法去另外一个https应用拿

修改httpd配置,此处列出完整配置

<VirtualHost *:443>                                                                                                                 
    ServerName git.example.com
    CustomLog logs/git.example.com_access.log common
    SSLEngine on
    SSLCertificateFile "/etc/httpd/cert/git.example.com.crt"
    SSLCertificateKeyFile "/etc/httpd/cert/git.example.com.key"
    # 此配置为本次新添加
    SSLCertificateChainFile "/etc/httpd/cert/git.example.com_root_bundle.crt"
    SSLProtocol all -SSLv2 -SSLv3
    ProxyPreserveHost On
    ProxyRequests Off
<Location />
    ProxyPass http://127.0.0.1:8088/
    ProxyPassReverse http://127.0.0.1:8088/
</Location>
</VirtualHost>

最后优雅地重新加载配置

sudo /etc/init.d/httpd graceful

再次用openssl检测,此时服务器端已经返回了完整的证书链,git也正常了。BTW,https水太深了。

为什么浏览器正常呢?因为浏览器会递归请求证书,而递归请求其实很慢,所以也就有了- OCSP Stapling,简单说就是,服务器去帮你把中间证书请求了,一起返回给客户端。

通过XFW访问MySQL无返回的问题

1. 症状概述

最近我们新加了一台机,在xx的机器上访问MySQL,可以正常连上,执行show databases等马上有结果的指令,可以正常返回,但如果表记录又上千万,select count(1) from xxx的时候,则会没有返回。

犹记得几个月前,我们在C机有个脚本通过http方式提交数据到远程机器S,S将结果存到MySQL,同样也是经过XFW,由于处理时间比较长(大概1分钟吧),C这边一直卡住, 因为没有收到S的返回,但在S通过tcpdump抓包发现,S是有返回的,而且尝试多次返回,说明什么?连接断了呗,但C和S都感知不到这个断开的操作,感觉是XFW检测到此数据连接没有数据发送,把它断了。

最后是在S上加了索引,使得存入MySQL操作秒返回,才解决了这个问题。天下武功,唯快不破,和XFW斗亦如是。

2. 排查过程

2.1 MySQL版本

首先说明下本次新加的机器,我们升级MySQL到5.7,以往的机器都是5.5,那是不是5.7的问题呢?

2.1.1 SUSE系统

以下都是在C(SUSE系统)上连接:

1.连MySQL 5.7(A)时,实际早就挂了(服务器端top看MySQL的CPU占用),但客户端这边还是阻塞状态,过了很久才显示:

ERROR 2013 (HY000): Lost connection to MySQL server during query

2.连MySQL 5.5时(B),偶尔会卡住,在服务器端抓包,没有数据过来,意味着实际上还没有连到过去,但如果能连过去,一般可以获取到返回

但我们后来通过tcpdump抓包发现,第一点的结论其实是错的,因为在MySQL的CPU占用降下去之后,从3306端口是有数据发出去的,也就是并没有挂,查询有结果,并有发出去,但客户端没有收到,C端等到超时了才退出并报错

2.1.2 CentOS系统

刚好有1台CentOS系统的机器,测试下,结果和上面SUSE系统一样

2.2 TCP的问题

2.2.1 SUSE系统

基于上面一开始提到的http提交数据的问题, 我们又感觉是tcp的问题,怎么验证?我们在A上开了ssh的密码登录,然后在C上ssh到A,然后A上执行mysql连接,再进行查询,结果发现,也是没有返回,最后提示

Disconnected; connection lost (Connection closed.).

那很明显了,就是tcp连接断开了

2.2.2 CentOS系统

上网查询发现CentOS上,ssh有一个维持心跳的参数,于是试了下

# 5s发送一次心跳包
ssh -o ServerAliveInterval=5 -pxxx username@A

通过上面的参数连接后,发现此时可以正常获取结果了

记得关闭A上的ssh密码登录

3. 解决

3.1 libkeepalive.so

通过以上测试,发现问题出现在tcp,那就有解决的方向了,但MySQL是没有这种维持心跳的参数的,但我们找到了一个libkeepalive.so的软件,通过它封装下,可以设置应用层的心跳,那就不用设置内核参数了

LD_PRELOAD=libkeepalive.so KEEPIDLE=5 KEEPCNT=3 KEEPINTVL=5 mysql  -h xxx
  • KEEPIDLE,空闲多久就开始发送心跳,此处为5
  • KEEPINTVL,多久发送一次心跳,此处为5
  • KEEPCNT,一共尝试多少次,此处为3次,如果3次都发送不成功,则认为失败,不再尝试

但比较遗憾, 没有生效,无论是SUSE还是CentOS

3.2 内核参数

我们在C端把内核参数设置下,感觉是比较重(需要修改内核参数)的解决办法。

# 多久探测一次,此处为5s
sysctl -w net.ipv4.tcp_keepalive_intvl=5
# 空闲多久后开始探测,此处为5s
sysctl -w net.ipv4.tcp_keepalive_time=5

通过上述设置,再直接用mysql连接就正常了。

以下是系统默认值,net.ipv4.tcp_keepalive_probes的意思是,每「net.ipv4.tcp_keepalive_time 」间隔,就探测一次,探测「net.ipv4.tcp_keepalive_probes」次,此处为9次,就停止探测

net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 5

为避免影响其他程序,建议只在测试时通过命令行设置,在测试完后,通过sysctl -p还原为系统默认配置

其他

ZZ:拷贝ibd文件的方式迁移数据

在mysql5.5之前,mysql实例中innodb引擎表的迁移是个头疼的问题,要么使用mysqldump导出,要么使用物理备份的方法,但是在mysql5.6之后的版本中,可以使用一个新特性,方便地迁移Innodb表,这样一来大的innodb表的迁移就显得很easy,这个特性就是innodb表空间传输:

详细请参考:Innodb 表空间传输迁移数据

ZZ:高效的 Linux 限流神器 Trickle

请见:高效的 Linux 限流神器 Trickle

2017年四月
« 3月    
 12
3456789
10111213141516
17181920212223
24252627282930