• 展开微博窗口
  • QQ:52619941
  • 微信:cnmemory
  • 展开分类目录
  • 还没有账号?

Memory

NAT网络下tcp_timestamp与tcp_tw_recycle引发丢包问题

场景

服务器A与服务器B在同一个NAT网络环境下,出口IP相同
服务器A -访问服务器C接口
服务器B -访问服务器C接口
此时AB其中一台服务器无法得到响应。

解决方式

通过查阅资料,是因为被调用服务端配置了tcp_tw_recycle,而调用方配置了tcp_timestamp造成了丢包的问题。

需要客户端关闭tcp_timestamp或者服务端关闭tcp_tw_recycle

## /etc/sysctrl.conf
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 0

启用swap来应对临时的内存不足问题

前段时间在一台小内存服务器上使用composer更新第三方类库时出现了内存不足的问题,以至于触发了OOM异常,使得composer进程被kill,无法完成更新。
通过free -h查看,测试服务器上并没有启用swap交换分区

当内存不足时,系统会将部分数据交换到swap空间上。类似win上的虚拟内存

OK,那就让我们启用swap。

  1. 创建交换分区文件
mkdir /data
touch /data/swapfile
  1. 分配交换分区容量
dd if=/dev/zero of=/data/swapfile bs=1M count=2048

/dev/zero是linux设备上一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL,

一次redis慢的问题分析及解决过程

背景

前段时间,公司某业务在高并发下,单机单个redis实例中,有个大字符串的get操作总是很慢。查看slowlog并无慢日志记录。

原因

通过咨询掌阅@老钱,得到了以下答复

redis的网络读写和逻辑处理都是单个线程处理的,slowlog只是衡量逻辑处理的时间并不包括接受指令和发送响应的时间。字符串的get操作逻辑非常快,所以slowlog没有任何信息。但是网络读写就慢了,特别是高并发下,内存中有大量待发送的缓冲数据堆积在那里,单线程需要拼命地发送数据,所以才会这样缓慢。

解决方案

当时考虑了两种解决方案:

  1. redis集群
  2. 将value进行本地缓存

考虑到项目初期的架构及业务代码的改动量,决定选择第二种方式解决,那么由于项目架构采用的是传统的nginx+php-fpm,无法常驻内存,于是决定利用/dev/shm(tmpfs)将这个value缓存到本地内存文件系统中。

既然用到了本地缓存,就要考虑集群下机器的value一致性,所以最终使用redis在每台机器上部署了一个订阅服务,当value发生改变时,更新本地缓存。

效果

从zabbix中可以很明显看到网络传输的峰值下降了非常多,可见这个key在业务高峰期时读取有多频繁。

结论

对于大字符串,偶尔读写不会存在问题,但是在频繁读写就会给redis带来不小的压力。…

利用nginx和ssh进行内网穿透

外网服务器

首先准备一套可以外网访问的服务器,并且安装nginx ,以centos为例

yum install nginx
service nginx start

编辑nginx的配置文件

vim /etc/nginx/conf.d/default.conf
server {
    listen 8000;
    server_name test.im050.com;
    location /