ipv6

ipv6 https://www.polarxiong.com/archives/%E6%90%AD%E5%BB%BAipv6-VPN-%E8%AE%A9ipv4%E4%B8%8Aipv6-%E4%B8%8B%E8%BD%BD%E9%80%9F%E5%BA%A6%E6%8F%90%E5%8D%87%E5%88%B0100M.html 禁用 ipv6 vim /etc/sysctl.d/ipv6.conf #disable ipv6 ipv6.disable=1 https://wiki.archlinux.org/title/IPv6#Disable_IPv6

2017-12-04 · 1 min · 10 words · -

journal, journalctl, syslog

journal, journalctl, syslog # -u 指定 unit journalctl -u file-server 清理磁盘空间 # Check current disk usage of journal files sudo journalctl --disk-usage # Delete journal logs older than 5 days: sudo journalctl --vacuum-time=5days # Delete log files until the disk space taken falls below 200M: sudo journalctl --vacuum-size=200M # Delete old logs and limit file number to 10: sudo journalctl --vacuum-files=10 Arch Linux 启用 systemd 后, 很多服务都被替换掉了, 当然 syslog 也不例外, 被 Systemd Journal 所替代。 ...

2017-11-24 · 2 min · 255 words · -

MySQL数据和索引占用空间查询

MySQL数据和索引占用空间查询 http://blog.csdn.net/light_language/article/details/70567962 关于查数据库和表中的数据和索引所占空间的大小的SQL方法: 查询information_schema架构中的tables表。 代码: 查询所有数据库占用磁盘空间大小的SQL语句: select table_schema,concat(truncate(sum(data_length)/1024/1024,2),‘MB’) as data_size, concat(truncate(sum(index_length)/1024/1024,2),‘MB’) as index_size from information_schema.tables group by table_schema order by sum(data_length) desc; 这里写图片描述 查询单个库中所有表磁盘占用大小的SQL语句: select table_name,concat(truncate(data_length/1024/1024,2),‘MB’) as data_size, concat(truncate(index_length/1024/1024,2),‘MB’) as index_size from information_schema.tables where table_schema=‘employees’ order by data_length desc;

2017-11-24 · 1 min · 39 words · -

前缀索引

前缀索引 http://www.cnblogs.com/studyzy/p/4310653.html 前缀索引,一种优化索引大小的解决方案 今天在读一篇关于数据库索引介绍的文章时,该文章提到了前缀索引,对于我这个搞数据库应用开发那么多年的人来说,这个词还真是一个新词,没用过。于是打算研究一番。 前缀索引似乎是MySQL中的一个概念,在SQL Server和Oracle中没提出这个概念。于是就安装了一个MySQL来做实验,搞清楚前缀索引。 前缀索引说白了就是对文本的前几个字符 (具体是几个字符在建立索引时指定) 建立索引,这样建立起来的索引更小,所以查询更快。有点相当于Oracle中对字段使用Left函数,建立函数索引,只不过MySQL的这个前缀索引在查询时是内部自动完成匹配的,并不需要使用left函数。 别的文章中提到: MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度。但是前缀索引也有它的坏处: MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index)。 建立前缀索引的语法为: ALTER TABLE table_name ADD KEY(column_name(prefix_length)); 这里最关键的参数就是prefix_length,这个值需要根据实际表的内容,得到合适的索引选择性 (Index Selectivity) 。索引选择性就是不重复的个数与总个数的比值。 select 1.0_count(distinct column_name)/count(_) from table_name 比如我们现在有个Employee表,其中有个FirstName字段,是varchar(50)的,我们查询该字段的索引选择性: select 1.0_count(distinct FirstName)/count(_) from Employee 得到结果0.7500,然后我们希望对FirstName建立前缀索引,希望前缀索引的选择性能够尽量贴近于对整个字段建立索引时的选择性。我们先看看3个字符,如何: select 1.0_count(distinct left(FirstName,3))/count(_) from Employee 得到的结果是0.58784,好像差距有点大,我们再试一试4个字符呢: select 1.0_count(distinct left(FirstName,4))/count(_) from Employee 得到0.68919,已经提升了很多,再试一试5个字符,得到的结果是0.72297,这个结果与0.75已经很接近了,所以我们这里认为前缀长度5是一个合适的取值。所以我们可以为FirstName建立前缀索引: alter table test.Employee add key(FirstName(5)) 建立前缀索引后查询语句并不需要更改,如果我们要查询所有FirstName为Devin的Employee,那么SQL仍然写成: select * from Employee e where e.FirstName=‘Devin’; 下面总结一下什么情况下使用前缀索引: 字符串列(varchar,char,text等),需要进行全字段匹配或者前匹配。也就是=‘xxx’ 或者 like ‘xxx%’ ...

2017-11-24 · 1 min · 76 words · -

MySQL SQL_NO_CACHE,sql_cache,RESET QUERY CACHE

MySQL SQL_NO_CACHE,sql_cache,RESET QUERY CACHE http://blog.csdn.net/xlgen157387/article/details/50767725 http://blog.51cto.com/janephp/1318705 减少碎片: 合适的query_cache_min_res_unit可以减少碎片,这个参数最合适的大小和应用程序查询结果的平均大小直接相关,可以通过内存实际消耗 (query_cache_size - Qcache_free_memory) 除以Qcache_queries_in_cache计算平均缓存大小。 可以通过Qcache_free_blocks来观察碎片,这个值反应了剩余的空闲块,如果这个值很多,但是 Qcache_lowmem_prunes却不断增加,则说明碎片太多了。可以使用flush query cache整理碎片,重新排序,但不会清楚,清空命令是reset query cache。整理碎片期间,查询缓存无法被访问,可能导致服务器僵死一段时间,所以查询缓存不宜太大 场景 产品中有一张图片表pics,数据量将近100万条,有一条相关的查询语句,由于执行频次较高,想针对此语句进行优化 表结构很简单,主要字段: user_id 用户ID picname 图片名称 smallimg 小图名称 一个用户会有多条图片记录,现在有一个根据user_id建立的索引: uid,查询语句也很简单: 取得某用户的图片集合: select picname, smallimg from pics where user_id = xxx; 优化前 执行查询语句 (为了查看真实执行时间,强制不使用缓存,为了防止在测试时因为读取了缓存造成对时间上的差别) select SQL_NO_CACHE picname, smallimg from pics where user_id=17853; 执行了10次,平均耗时在40ms左右 使用explain进行分析: explain select SQL_NO_CACHE picname, smallimg from pics where user_id=17853 这里写图片描述 使用了user_id的索引,并且是const常数查找,表示性能已经很好了 优化后 因为这个语句太简单,sql本身没有什么优化空间,就考虑了索引 修改索引结构,建立一个(user_id,picname,smallimg)的联合索引: uid_pic 重新执行10次,平均耗时降到了30ms左右 使用explain进行分析 这里写图片描述 ...

2017-11-24 · 2 min · 336 words · -

karma

karma JavaScript 作为 web 端使用最广泛的编程语言,它是动态语言,缺乏静态类型检查,所以在代码编译期间,很难发现像变量名写错,调用不存在的方法等错误,除非在运行时才能暴露出来,所以非常有必要有一个测试工具来验证你的代码。 karma 就是在这样的背景下产生的, 它是一个 runner , 旨在帮助开发者简单而又快速的进行自动化单元测试, 目前已经用在很多大型的项目, google 和 youtube 这些公司都在用它, 在 npm 官方网站上, 它也是一个比较流行的 npm 模块。 http://taobaofed.org/blog/2016/01/08/karma-origin/

2017-11-24 · 1 min · 23 words · -

MySQL 索引 失效

‘MySQL 索引 失效’ http://www.jianshu.com/p/932bcdf2c89f 索引并不会时时发生,有时就算是where查询字段中添加了索引,索引也会失效,下面我们来讲讲五种索引失效的场景。 1.查询条件包含or 查询条件包含or时,可能会导致索引失效: 失效索引 当or左右查询字段只有一个是索引,该索引失效,explain执行计划key=null;只有当or左右查询字段均为索引时,才会生效; 有效索引 2.组合索引,不是使用第一列索引,索引失效 如果select from key1=1 and key2= 2;建立组合索引 (key1,key2) ; select from key1 = 1;组合索引有效; select from key1 = 1 and key2= 2;组合索引有效; select from key2 = 2;组合索引失效;不符合最左前缀原则 3.like 以%开头 使用like模糊查询,当%在前缀时,索引失效;eg: 索引失效 当前缀没有%,后缀有%时,索引有效;eg: 索引有效 4.如何列类型是字符串,where时一定用引号括起来,否则索引失效 不用引号括起来 作者: 程序猿小屌丝 链接: http://www.jianshu.com/p/932bcdf2c89f 來源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2017-11-24 · 1 min · 52 words · -

go, time.Tick, tick immediately

‘go, time.Tick, tick immediately’ How to get time.Tick to tick immediately ticker := time.NewTicker(period) for ; true; <-ticker.C { ... } https://stackoverflow.com/questions/32705582/how-to-get-time-tick-to-tick-immediately/47448177#47448177 https://github.com/golang/go/issues/17601

2017-11-23 · 1 min · 23 words · -

慢查询优化

慢查询优化 https://tech.meituan.com/MySQL-index.html 慢查询优化基本步骤 0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE 1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高 2.explain查看执行计划,是否与1预期一致 (从锁定记录较少的表开始查询) 3.order by limit 形式的sql语句让排序的表优先查 4.了解业务方使用场景 5.加索引时参照建索引的几大原则 6.观察结果,不符合预期继续从0分析 Using filesort MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause. Using temporary,表示需要创建临时表以满足需求,通常是因为GROUP BY的列没有索引,或者GROUP BY和ORDER BY的列不一样,也需要创建临时表,建议添加适当的索引。 ...

2017-11-22 · 1 min · 87 words · -

MySQL using having

MySQL using having http://wuzhangshu927.blog.163.com/blog/static/1142246872010113093426574/ USING() using 可用在 join 语句相同字段连接, 起到和 ON 相同作用, inner join 和 left join 中都可以使用 LEFT JOIN 正常写法: SELECT t1.id,t2.name FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE .... 其实也可以这么写: SELECT t1.id,t2.name FROM t1 LEFT JOIN t2 USING(id) WHERE .... HAVING MySQL 中的 where 和 having 子句都可以实现筛选记录的功能, having 可以认为是对 where 的补充, 因为它可以对分组数据进行再次判断, 一般跟在 group by 后面, 并可以使用聚集函数 (sum, min, max, avg, count) SELECT `uid`, SUM(`points`) num FROM table GROUP BY `uid` HAVING num > 1000

2017-11-22 · 1 min · 78 words · -

go xml

go xml https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/07.1.md

2017-11-21 · 1 min · 3 words · -

Linux磁盘分区UUID, blkid

Linux 磁盘分区 UUID, blkid http://tiger2020.blog.51cto.com/723949/1535774 查看设备的 uuid 的三种方法, 总结如下: 1 命令查看: blkid 2 文件查看: ls -l /dev/disk/by-uuid 3 命令查看: vol_id /dev/sda1 UUID的作用及意义 1: 它是真正的唯一标志符 UUID为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的。如果你在系统中启动的时候,使用盘符挂载时,可能找不到设备而加载失败,而使用UUID挂载时,则不会有这样的问题。 2: 设备名并非总是不变的 自动分配的设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺序。如果你在插入了USB盘时启动了系统,而下次启动时又把它拔掉了,就有可能导致设备名分配不一致。 使用UUID对于挂载移动设备也非常有好处,它支持各种各样的卡,而使用UUID总可以使同一块卡挂载在同一个地方。 3: Ubuntu中的许多关键功能现在开始依赖于UUID

2017-11-19 · 1 min · 31 words · -

golang select

golang select package main import ( "fmt" "time" ) func main() { fmt.Println("selectx") ch0 := make(chan struct{}) ch1 := make(chan struct{}) go func() { for { select { case v0 := <-ch0: fmt.Println("ch0: ", v0) case v1 := <-ch1: fmt.Println("ch1: ", v1) } } }() time.Sleep(1 * time.Second) ch0 <- struct{}{} ch1 <- struct{}{} ch0 <- struct{}{} ch1 <- struct{}{} ch1 <- struct{}{} ch1 <- struct{}{} time.Sleep(3 * time.Second) fmt.Println("selectx end") } // output: // ch0: {} // ch1: {} // ch0: {} // ch1: {} // ch1: {} // ch1: {} 代码执行到 select 时默认会阻塞, 直到任意一个 case 评估通过, 如果有多个 case 符合执行条件就从里面随机选一个执行. ...

2017-11-17 · 2 min · 386 words · -

PAM(Pluggable Authentication Modules)

PAM(Pluggable Authentication Modules) auth: 表示鉴别类接口模块类型用于检查用户和密码,并分配权限; account: 表示账户类接口,主要负责账户合法性检查,确认帐号是否过期,是否有权限登录系统等; session: 会话类接口。实现从用户登录成功到退出的会话控制; password: 口令类接口。控制用户更改密码的全过程。也就是有些资料所说的升级用户验证标记。 system-auth文件是PAM模块的重要配置文件,它主要负责用户登录系统的身份认证工作,不仅如此,其他的应用程序或服务可以通过include接口来调用它 (该文件是system-auth-ac的软链接) 。此外password-auth配置文件也是与身份验证相关的重要配置文件,比如用户的远程登录验证(SSH登录)就通过它调用。而在Ubuntu、SuSE Linux等发行版中,PAM主要配置文件是common-auth、common-account、common-password、common-session这四个文件,所有的应用程序和服务的主要PAM配置都可以通过它们来调用。 http://www.infoq.com/cn/articles/linux-pam-one Linux中pam_cracklib.so的minlen和credit参数 Linux中的PAM(Pluggable Authentication Modules)包含很多有用的模块,其中pam_cracklib.so模块可以配置密码长度复杂度的需求。一般需要同时配置/etc/pam.d/目录中的system-auth和password-auth文件,例如下面 password requisite pam_cracklib.so try_first_pass retry=3 type= ocredit=2 minlen=10 限定密码长度主要涉及minlen参数,以及ucredit lcredit dcredit ocredit这四个credit参数,分别表示大写字符、小写字符、数字、其它字符的额外credit值。 这里的minlen=10实际上表示最小分数为10,而不是简单的最小长度为10。密码每有一个任意字符会有一分,另外,ucredit/lcredit/dcredit/ocredit默认值均为1,表示密码中四种字符的类别数,每多一种,就会得到额外的一分。 在这里,ocredit=2 minlen=10,也就是说,如果密码全是其它字符的话,最少需要minlen - ocredit = 10-2 = 8位;若密码包含其它字符和小写字符,最少需要minlen - ocredit - lcredit = 10-2-1 = 7位字符,以此类推。 另外ucredit/lcredit/dcredit/ocredit参数的值如果为负数,例如dcredit=-2,则表示密码中最少需要2位数字。 另外,除了密码长度之外,pam_cracklib.so库默认还会做其它方面的简单检查,并且库代码里写死了密码最小长度不能小于6. reference http://www.deer-run.com/~hal/sysadmin/pam_cracklib.html http://www.infoq.com/cn/articles/linux-pam-one

2017-11-14 · 1 min · 54 words · -

partx

partx http://gulingzi.blog.51cto.com/2208376/1561403 /proc/partitions 记录了系统中所有硬盘及其上面的分区,包括已挂载和未挂载的。 有些硬盘没有记录分区信息,可能是没有分区,或者未记录 对于分区完成,但是尚未挂载的硬盘分区,partx告诉内核去做登记,以备挂载。 partx 告诉内核去识别、登记某个硬盘上的分区信息。并不是加载,只是识别并记录而已。 或者删除某个分区的记录。 -a 登记某块盘上的所有分区信息,如果某个分区信息已有记录,就会报错: BLKPG: Device or resource busy error adding partition 4 如果某磁盘上的分区信息都没有被记录,则安静完成。 -d 删除内核中关于某磁盘上的所有分区的记录 (不是卸载) -d -nr m-n 删除从第m-n分区的记录 如果已经挂载,则无法删除,并报错: error deleting partition 5: BLKPG: Device or resource busy 如果都删除了,使用-a选项来重新登记,不会有报错。 一般分区完成后,系统会识别到。 -l 列出某磁盘上的分区情况。数据从磁盘上获取,并不是来源于/proc/partitions

2017-11-13 · 1 min · 42 words · -

prototype

prototype 基于原型编程是面向对象编程的一种方式, 原型编程里没有 class 的概念, 直接使用对象, 又叫基于实例的编程. 基于类的编程中, 类定义了对象的基本布局和函数特性, 接口是可以使用的对象, 它基于特定类样式. 类表现为行为和结构的集合, 对接口来说这些类的行为和结构是想同的. 区分的规则是基于行为和结构之后才是状态.

2017-11-13 · 1 min · 14 words · -

System V init, Upstart,Systemd

System V init, Upstart,Systemd http://monklof.com/post/14/ https://www.ibm.com/developerworks/cn/linux/1407_liuming_init2/index.html

2017-11-10 · 1 min · 6 words · -

city

city Amsterdam, Netherlands, 荷兰 Bangalore, India london ottawa 加拿大.渥太华 Richardson,Texas,US RTP,US 北卡 sanjose,California,US 圣荷西 shanghai sigapore sydney telaviv 特拉维夫 tokyo

2017-11-10 · 1 min · 20 words · -

Round Robin 轮询调度算法

Round Robin 轮询调度算法 Round Robin Scheduling 轮询调度算法 轮询调度 (Round Robin Scheduling) 算法就是以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。 轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。 轮询调度算法假设所有服务器的处理性能都相同,不关心每台服务器的当前连接数和响应速度。当请求服务间隔时间变化比较大时,轮询调度算法容易导致服务器间的负载不平衡。 所以此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。 作者: 小程故事多 链接: http://www.jianshu.com/p/92666209041a 來源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 负载均衡调度算法默认是 round robin,也就是轮询调度算法。 算法本身很简单,轮着一个一个来,非常简单高效公平的调度算法。 突然发现了一直被忽视的问题,为啥叫 round robin ? robin 明明是旅鸫,亦称美洲知更鸟,与轮询一点关系都没有。在查询资料后发现这个单词来源挺有意思的,这里分享给大家。 round robin 来源于法语ruban rond (round ribbon) ,意思是环形丝带。 在17、18世纪时法国农民希望以请愿的方式抗议国王时,通常君主的反应是将请愿书中最前面的两至三人逮捕并处决,所以很自然地没有人希望自己的名字被列在前面。为了对付这种专制的报复,人们在请愿书底部把名字签成一个圈 (如同一条环状的带子) ,这样就找不出带头大哥,于是只能对所有参与者进行同样的惩罚。 1731年,英国皇家海军最初使用了这个名词,以循环顺序签署请愿书,这样就没法找到带头大哥了。 非常贴切有木有,后端服务器轮着来处理请求,一个个都不要抢,都要出来接受处决。 https://zhuanlan.zhihu.com/p/84799744 常见的负载均衡算法包含: 轮询法 (Round Robin) 加权轮询法 (Weight Round Robin) 随机法 (Random) 加权随机法 (Weight Random) 平滑加权轮询法 (Smooth Weight Round Robin) 源地址哈希法 (Hash) 最小连接数法 (Least Connections) ———————————————— 版权声明: 本文为CSDN博主「志波同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接: https://blog.csdn.net/claram/article/details/90265243

2017-11-10 · 1 min · 81 words · -

go channel

go channel channel 是 Go 中的一个核心类型, 可以把它看成一个管道, 通过它并发核心单元就可以发送或者接收数据进行通讯。goroutine 是 Go 语言的基本调度单位, 而 channels 则是它们之间的通信机制。操作符 <- 用来指定管道的方向,发送或接收。如果未指定方向,则为双向管道。golang 的 channel 就是一个 环形队列/ringbuffer 的实现。 我们称 chan 为管理结构,channel 里面可以放任何类型的对象,我们称之为元素。 Channel 定义 ChannelType = ( "chan" | "chan<-" | "<-chan" ) ElementType . 可选的 <- 代表 channel 的方向 (是数据的流向)。如果没有指定方向,那么 Channel 就是双向的,既可以接收数据,也可以发送数据。 <- // channel 的操作符 ch <- v // 发送值 v 到 Channel ch 中 v := <-ch // 从 Channel ch 中接收数据, 并将数据赋值给 v var foo chan T // 可以接收和发送类型为 T 的数据 var foo chan<- float64 // 只可以用来发送 float64 类型的数据 var foo <-chan int // 只可以用来接收 int 类型的数据 // <- 总是优先和最左边的类型结合。(The <- operator associates with the leftmost chan possible) chan<- chan int // 等价 chan<- (chan int) chan<- <-chan int // 等价 chan<- (<-chan int) <-chan <-chan int // 等价 <-chan (<-chan int) chan (<-chan int) // channel 定义 var dataChan <-chan []byte // 无缓冲的 channel // 使用 make 初始化 Channel, 并且可以设置容量, channel 初始化, 初始化之后才能使用 // 未设置容量的 channel, 如果没有设置容量,或者容量设置为0, 说明Channel没有缓存,只有sender和receiver都准备好了后它们的通讯 // 无缓冲的 channel 由于没有缓冲发送和接收需要同步. // channel 无缓冲时,发送阻塞直到数据被接收,接收阻塞直到读到数据。 dataChan := make(<-chan []byte) // 容量为100的 channel ch := make(chan int, 100) // 容量(capacity)代表Channel容纳的最多的元素的数量,代表Channel的缓存的大小。 // 创建一个双向channel, interface{}表示chan可以为任何类型 foo := make(chan interface{}) // 可以通过内建的close方法可以关闭Channel。 close(foo) // channel的 receive支持 multi-valued assignment,如 v, ok := <-ch 往一个已经被 close 的 channe l中继续发送数据会导致 run-time panic。 ...

2017-11-09 · 3 min · 450 words · -