w1100n
This site is best viewed in Google Chrome
wiloon, 11/21/2017 16:07

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

wiloon, 11/19/2017 15:03

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

wiloon, 11/17/2017 16:37

https://yanyiwu.com/work/2014/11/08/golang-select-typical-usage.html golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。 示例: ch1 := make (chan int, 1) ch2 := make (chan int, 1) … select { case <-ch1: fmt.Println(“ch1 pop one element”) case <-ch2: fmt.Println(“ch2 pop … Continue reading

wiloon, 11/16/2017 16:21

https://www.ezloo.com/2011/04/a_mx_cname_txt_aaaa_ns.html A记录 A记录是用来创建到IP地址的记录。 A记录设置技巧 1、如果想创建不带www的记录,即ezloo.com,在主机记录中填写@或者留空,不同的注册商可能不一样。 2、创建多个域名到同一个IP,比如给博客建了二级域名,可以使用*.blog.ezloo.com来指向一个IP,这样的话,不管是访问a.blog.ezloo.com还是b.blog.ezloo.com都能到同一个IP。 3、如果你给同一个二级域名设置了多个A记录,比如你建了两个blog的A记录,其中一个指向了111.111.111.111,另一个指向了111.111.111.112,那么在查询的时候,每次返回的数据包含了两个IP地址,但是在返回的过程中数据排列的顺序每次都不相同。由于大 部分的客户端只选择第一条记录所以通过这种方式可以实现一定程度的负载均衡。 在命令行下可以通过nslookup -qt=a www.ezloo.com来查看A记录。 MX记录 在命令行下可以通过 nslookup -qt=mx ezloo.com 来查看MX记录。 mx 记录的权重对 Mail 服务是很重要的,当发送邮件时,Mail 服务器先对域名进行解析,查找 mx 记录。先找权重数最小的服务器(比如说是 10),如果能连通,那么就将服务器发送过去;如果无法连通 mx 记录为 10 的服务器,那么才将邮件发送到权重为 20 的 mail 服务器上。 这里有一个重要的概念,权重 20 的服务器在配置上只是暂时缓存 mail ,当权重 20 的服务器能连通权重为 … Continue reading

wiloon, 11/16/2017 10:54

go build 通过go build加上要编译的Go源文件名,我们即可得到一个可执行文件,默认情况下这个文件的名字为源文件名字去掉.go后缀。 $ go build hellogo.go $ ls hellogo hellogo.go 当然我们也 可以通过-o选项来指定其他名字: $ go build -o myfirstgo hellogo.go $ ls myfirstgo hellogo.go 如果我们在go-examples目录下直接执行go build命令,后面不带文件名,我们将得到一个与目录名同名的可执行文件: $ go build $ ls go-examples hellogo.go go install 与build命令相比,install命令在编译源码后还会将可执行文件或库文件安装到约定的目录下。 go install编译出的可执行文件以其所在目录名(DIR)命名 go install将可执行文件安装到与src同级别的bin目录下,bin目录由go … Continue reading

wiloon, 11/14/2017 14:38

Linux中pam_cracklib.so的minlen和credit参数 11 June 2014 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

wiloon, 11/14/2017 14:29

应用举例: http://qingwang.blog.51cto.com/505009/237661 1、将 newuser2 添加到组 staff 中 usermod -G staff newuser2 2、修改 newuser 的用户名为 newuser1 usermod -l newuser1 newuser 3、锁定账号 newuser1 usermod -L newuser1 4、解除对 newuser1 的锁定 usermod -U newuser1 功能说明:修改用户帐号。 语  法:usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s … Continue reading

wiloon, 11/13/2017 17:22

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

wiloon, 11/13/2017 16:47

http://www.linuxfly.org/post/146/ 在某些场合,可能我们需要在脚本中生成一个临时文件,然后把该文件作为最终文件放入目录中。(可参考ntop.spec文件)这样有几个好处,其中之一就是临时文件不是唯一的,可以通过变量赋值,也可根据不同的判断生成不同的最终文件等等。 一、cat和EOF cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的; EOF是“end of file”,表示文本结束符。 结合这两个标识,即可避免使用多行echo命令的方式,并实现多行输出的结果。 二、使用 看例子是最快的熟悉方法: cat << EOF > test.sh !/bin/bash you Shell script writes here. EOF 结果: 引用 cat test.sh #!/bin/bash #you Shell script writes here. 可以看到,test.sh的内容就是cat生成的内容。 三、其他写法 1、追加文件 cat << EOF >> test.sh … Continue reading

wiloon, 11/10/2017 17:23

http://monklof.com/post/14/ https://www.ibm.com/developerworks/cn/linux/1407_liuming_init2/index.html

wiloon, 11/10/2017 16:32

https://fabianlee.org/2017/05/21/golang-running-a-go-binary-as-a-systemd-service-on-ubuntu-16-04/ http://shanks.leanote.com/post/Go%E5%88%9B%E5%BB%BAdaemon%E7%A8%8B%E5%BA%8F Supervisor go-daemon start-stop-daemon upstart systemd

wiloon, 11/10/2017 16:03

http://www.cnblogs.com/peida/archive/2012/12/21/2827366.html 每天一个linux命令(43):killall命令 Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name)。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。 1.命令格式: killall[参数][进程名] 2.命令功能: 用来结束同名的的所有进程 3.命令参数: -Z 只杀死拥有scontext 的进程 -e 要求匹配进程名称 -I 忽略小写 -g 杀死进程组而不是进程 -i 交互模式,杀死进程前先询问用户 -l 列出所有的已知信号名称 -q 不输出警告信息 -s 发送指定的信号 -v 报告信号是否成功发送 -w 等待进程死亡 –help 显示帮助信息 –version 显示版本显示 4.使用实例: 实例1:杀死所有同名进程 命令: killall … Continue reading

wiloon, 11/10/2017 13:48

https://www.nginx.com/resources/admin-guide/tcp-load-balancing/ https://aotu.io/notes/2016/08/16/nginx-https/index.html http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html http://seanlook.com/2015/05/28/nginx-ssl/ https://imququ.com/post/enable-tls-1-3.html

wiloon, 11/10/2017 10:53

Round Robin 轮询调度算法 轮询调度(Round-Robin Scheduling) 轮询调度(Round Robin Scheduling)算法就是以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。 轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。 轮询调度算法流程   假设有一组服务器N台,S = {S1, S2, …, Sn},一个指示变量i表示上一次选择的服务器ID。变量i被初始化为N-1。一个很经典的算法程序如下: j = i; do { j = (j + 1) mod n; i = j; return Si; } … Continue reading

wiloon, 11/10/2017 10:31

https://www.cnblogs.com/naaoveGIS/p/5478208.html upstream tomcat_server{ server localhost:8080; } server{ listen 80; server_name enx.wiloon.com; location / { proxy_pass http://tomcat_server; } }

wiloon, 11/9/2017 14:11

http://colobu.com/2016/04/14/Golang-Channels/ Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。 它的操作符是箭头 <- 。 ch <- v // 发送值v到Channel ch中 v := <-ch // 从Channel ch中接收数据,并将数据赋值给v (箭头的指向就是数据的流向) 就像 map 和 slice 数据类型一样, channel必须先创建再使用: ch := make(chan int) 使用make初始化Channel,并且可以设置容量: make(chan int, 100)

wiloon, 11/8/2017 16:37

http://wiki.jikexueyuan.com/project/nginx/model-architecture.html event module: 搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理。包括 ngx_events_module, ngx_event_core_module和ngx_epoll_module 等。Nginx 具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。 phase handler: 此类型的模块也被直接称为 handler 模块。主要负责处理客户端请求并产生待响应内容,比如 ngx_http_static_module 模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。 output filter: 也称为 filter 模块,主要是负责对输出的内容进行处理,可以对输出进行修改。例如,可以实现对输出的所有 html 页面增加预定义的 footbar 一类的工作,或者对输出的图片的 URL 进行替换之类的工作。 upstream: upstream 模块实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。upstream 模块是一种特殊的 handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。 load-balancer: 负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。

wiloon, 11/8/2017 9:43

https://gist.github.com/jcouyang/9914091 OPPC模型瓶颈 传统服务器模型如Apache为每一个请求生成一个子进程。当用户连接到服务器的一个子进程就产生,并处理连接。每个连接获得一个单独的线程和子进程。当用户请求数据返回时,子进程开始等待数据库操作返回。如果此时另一个用户也请求返回数据,这时就产生了阻塞。 这种模式在非常小的工作负荷是表现良好,当请求的数量变得太大是服务器会压力过于巨大。 当Apache达到进程的最大数量,所有进程都变得缓慢。每个请求都有自己的线程,如果服务代码使用PHP编写时,每个进程所需要的内存量是相当大的[1]。 fork()操作延时 事实上,基于OPPC的网络并不如想象中的高效。首先新建进程的性能很大程度上依赖于操作系统对fork()的实现,然而不同操作系统的处理并非都理想。如图为各操作系统fork()的延迟时间对比。 操作系统fork操作只是简单的拷贝分页映射。动态链接为共享库和全局偏移表中的ELF(Executable and Linking Format)部分创建太多的分页映射。虽然静态的链接fork会是的性能大幅度提升,但是延时依然不乐观。 图 1 fork延时 进程调度 Linux每10毫秒(Alpha是1毫秒,该值为已编译常量)中断一次在运行态的进程,查看是否要切换别的进程执行。进程调度的任务就是决定下一个应该执行的进程,而其难度就在于如何公平的分配CPU资源。一个好的调度算法应该给每一个进程都分享公平的CPU资源,而且不应该出现饥饿进程。 Unix系统采用多级反馈队列调度算法。使用多个不同优先级的就绪队列,使用Heap保持队列按优先级顺序排序。Linux 2.6版本提供了一个复杂度O(1)的调度算法,将进程调度延时降至最小。但是进程调度的频率是100Hz,意味着10毫秒会中止一个进程而判断是否需要切换到另一个进程。如果切换过多,会让CPU忙于切换,导致降低吞吐量。 内存占用与线程   创建多进程会带来另外一个问题:内存消耗。 每一个创建的进程都会占用内存,在Linux 2.6中的测试结果,400个左右的连接后fork()的性能要超过pthread_create()的性能。IBM对Linux做过优化后,一个进程可以处理10万个连接。fork()在每一个连接时都fork()一次成本太高,多线程在于需要考虑线程安全(thread-safe)与死锁(deadlock),以及内存泄露问题这些问题。    可靠性 该模型具有可靠性问题。一个配置不当的服务器,很容易遭受拒绝服务攻击(DoS)。当大量并发请求的服务器资源时,负载均衡配置不当时服务器会很快耗尽源而奔溃。 同步阻塞 I/O 在这个模型中,应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发生错误)。调用应用程序处于一种不再占用CPU,而只是简单等待响应的状态,但是该进程依然占用着资源。当大量并发I/O请求到达时,则会产生I/O阻塞,造成服务器瓶颈。 事件驱动模型服务器 通过上诉分析与实验说明,事实上,操作系统并不是设计来处理服务器工作负载。传统的线程模型是基于运行应用程序是的一些密集型操作的需要。 操作系统的设计是让用户执行的多线程程序,使后台文件写入和UI操作同时进行,而并不是设计于处理大量并发请求连接。 Fork和多线程是相当费资源的操作,创建线程需要分配一个全新的内存堆栈。此外,上下文切换也是一项开销的,CPU调度模型是并不太适合一个传统的Web服务器。 因此,OPPC模型面临着多进程多线程的延迟已经内存消耗的问题。要用OPPC模型解决C10K问题显得十分复杂。 为解决C10K问题,一些新的服务器呈现出来。下列是解决C10K问题的Web服务器: nginx:一个基于事件驱动的处理请求架构反向代理服务器。 Cherokee:Twitter使用的开源Web服务器。 [Tornado][13]:一个Python语言实现的非阻塞式Web服务器框架。Facebook的FriendFeed模块使用此框架完成。 Node.js:异步非阻塞Web服务器,运行于Google V8 JavaScript引擎。 … Continue reading

wiloon, 11/8/2017 8:40

几个相关的概念:TPS、QPS、RPS,TPS:Transactions Per Second(每秒事务处理数),指服务器每秒处理的事务次数。一般用于评估数据库、交易系统的基准性能。QPS:Queries Per Second(查询量/秒),是服务器每秒能够处理的查询次数,例如域名服务器、Mysql查询性能。RPS:Request Per Second(请求数/秒)RPS(Request Per Second)和QPS可以认为是一回事。RT:Response Time(响应时间):客户端发一个请求开始计时,到客户端接收到从服务器端返回的响应结果结束所经历的时间,响应时间由请求发送时间、网络传输时间和服务器处理时间三部分组成。也叫Think Time。并发数与TPS/QPS的关系:QPS(TPS)= 并发数/平均响应时间这里的并发数如果为事务处理请求数,则为TPS,如果为查询请求数,则为QPS。 作者:梁川 链接:https://www.zhihu.com/question/36734171/answer/68995124 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 QPS(TPS)= 并发数/平均响应时间 或者 并发数 = QPS平均响应时间 这里响应时间的单位是秒 举例,我们一个HTTP请求的响应时间是20ms,在10个并发的情况下,QPS就是 QPS=101000/20=500。 这里有个关键的点就是QPS一定是跟并发数联系在一起的,离开并发数谈QPS是没意义的。 http://homuralovelive.com/sddtc/tech/2016/06/26/performance-test-qps-tps.html

wiloon, 11/7/2017 17:24

ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,这是一个类声明周期的第一步(一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况)。详情请参阅:详解Java类的生命周期 那ServiceLoader又是什么呢?ServiceLoader:一个简单的服务提供者加载设施。服务 是一个熟知的接口和类(通常为抽象类)集合。服务提供者 是服务的特定实现。提供者中的类通常实现接口,并子类化在服务本身中定义的子类。服务提供者可以以扩展的形式安装在 Java 平台的实现中,也就是将 jar 文件放入任意常用的扩展目录中。也可通过将提供者加入应用程序类路径,或者通过其他某些特定于平台的方式使其可用。……唯一强制要求的是,提供者类必须具有不带参数的构造方法,以便它们可以在加载中被实例化。 通过在资源目录META-INF/services中放置提供者配置文件 来标识服务提供者。文件名称是服务类型的完全限定二进制名称。该文件包含一个具体提供者类的完全限定二进制名称列表,每行一个。忽略各名称周围的空格、制表符和空行。注释字符为’#'(‘\u0023’, NUMBER SIGN);忽略每行第一个注释字符后面的所有字符。文件必须使用 UTF-8 编码。 以延迟方式查找和实例化提供者,也就是说根据需要进行。服务加载器维护到目前为止已经加载的提供者缓存。每次调用 iterator 方法返回一个迭代器,它首先按照实例化顺序生成缓存的所有元素,然后以延迟方式查找和实例化所有剩余的提供者,依次将每个提供者添加到缓存。可以通过 reload 方法清除缓存。 …… 以上来源于Java API里的说明,也许说的很专业,让我们有点晕头转向,我们可以简单的认为:ServiceLoader也像ClassLoader一样,能装载类文件,但是使用时有区别,具体区别如下:(1) ServiceLoader装载的是一系列有某种共同特征的实现类,而ClassLoader是个万能加载器;(2)ServiceLoader装载时需要特殊的配置,使用时也与ClassLoader有所区别;(3)ServiceLoader还实现了Iterator接口。[如有错误或不到的地方敬请指出,互相学习:)] SPI 和 ServiceLoader 1 SPI:Service Provider Interface 一个服务(Service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按照SPI 标准存放到资源路径META-INF/services目录下,文件的命名为该服务接口的全限定名 许多开发框架都使用了Java的SPI机制,如java.sql.Driver的SPI实现(mysql驱动、oracle驱动等)、common-logging的日志接口实现、dubbo的扩展实现等等。 我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。 为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。 java spi的具体约定如下:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入 1.例子 第一步:提供一个接口和它的若干个实现: … Continue reading

next page
辽ICP备14012896