开启TCP BBR拥塞控制算法

1 下载最新内核 4.9+
Kernel/LTSEnablementStack - Ubuntu Wiki
更新完内核如果 uname -r 看见没有变化,说明需要 reboot 一下

2 开启bbr
执行 lsmod | grep bbr,如果结果中没有 tcp_bbr 的话就先执行以下代码添加内核模块

modprobe tcp_bbr
echo "tcp_bbr" >> /etc/modules-load.d/modules.conf
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

保存生效

sysctl -p

执行以下命令来验证

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

如果结果都有 bbr, 则证明你的内核已开启 bbr

执行 lsmod | grep bbr, 看到有 tcp_bbr 模块即说明 bbr 已启动

另外,阿里云的专用网络,因为网卡是nat的内网,所以bbr不会有效果。ip addr 看到的只是内网地址的话,就是专用网络

参考:开启TCP BBR拥塞控制算法 · iMeiji/shadowsocks_install Wiki

MYSQL隔离级别

名词定义
脏读:事务A读到事务B尚未提交的修改(update,Insert,Delete)记录后,事务B回滚了,事务A读取到的就是不存在的数据;

不可重复读:事务A第一次读取后,事务B进行了修改(Delete、Update),再当事务A读取时,发现数据在一个事务中前后不一;

幻读:和不可重复读类似,但幻读针对Insert操作,当事务A第一读取是表内有10行数据,此时事务B插入(Insert)了一条,当事务A再次读取时发现变成了11行,造成幻觉;

丢失更新:事务A和事务B拿到同一份数据1,A在1的基础上加1变成2后,此时B也在1的基础上加2变成3,由于B提交晚,因此最终数据变成了3,覆盖了事务A的操作,称为丢失更新;

mysql隔离级别

|事务隔离级别 |脏读 |不可重复读 |幻读|
|:----|:----|:----|:----|
|读未提交(read-uncommitted) |是 |是 |是|
|不可重复读(read-committed) |否 |是 |是|
|可重复读(repeatable-read) |否 |否 |是|
|串行化(serializable) |否 |否 |否|

mysql默认的事务隔离级别为repeatable-read

树莓派安装php5.6

sudo vim /etc/apt/sources.list
将内容改成下面这样

#deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspbian.org/raspbian/ wheezy main contrib non-free rpi
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ jessie main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ jessie main non-free contrib

然后 sudo apt-get update

然后 sudo apt-get install php5 php5-fpm php5-cli

然后 php -v 看看是不是装好了5.6

别忘了安装pdo sudo apt-get install php5-mysqlnd php5-sqlite php-db

- 阅读剩余部分 -

js中的this指向

this的指向大致有四种:

1.函数调用的时候,this指向window。

functionaa(){
    console.log(this)
}aa() //window

2.当是方法调用的时候,this指向方法所在的对象。

var a={}
a.name = 'hello';
a.getName = function(){
    console.log(this.name)
}
a.getName() //'hello'

- 阅读剩余部分 -

HTTP 头部详细解释

  1. Accept:告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。
  2. Accept-Charset:浏览器申明自己接收的字符集
    Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法 (gzip,deflate)
    Accept-Language:浏览器申明自己接收的语言语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。
  3. Accept-Ranges:WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。
  4. Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
  5. Authorization:当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,该头部来回应自己的身份验证信息给WEB服务器。

- 阅读剩余部分 -