Memcache使用注意事项
- 慎重调整存储条目的大小
如何分析Memcache 的状态指标
- evicted 能说明什么?
DevOps
1. rsyslog的tcp远程记录日志,如果远程主机端口宕掉,可以配置成先写本地文件队列,配置如下:
1 2 3 4 5 6 7 8 9 10 |
$WorkDirectory /var/rsyslog/spool $ActionQueueFileName uniqName # unique name prefix for spool files $ActionQueueMaxDiskSpace 10m # 1gb space limit (use as much as possible) $ActionQueueSaveOnShutdown on # save messages to disk on shutdown $ActionQueueType LinkedList # run asynchronously $ActionResumeRetryCount -1 # infinite retries if host is down # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional local0.* @@192.168.0.1:1234 |
注意: 指定的目录需要手动创建
每个tcp端口可以配置一个队列文件,队列文件不是实时写入到,当服务stop到时候(或者bufer满到时候)才会生成队列文件,配置多个tcp到队列文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$WorkDirectory /var/rsyslog/spool $ActionQueueFileName uniqName1234 # unique name prefix for spool files $ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible) $ActionQueueSaveOnShutdown on # save messages to disk on shutdown $ActionQueueType LinkedList # run asynchronously $ActionResumeRetryCount -1 # infinite retries if host is down # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional local0.* @@192.168.0.1:1234 $ActionQueueFileName uniqName1235 # unique name prefix for spool files $ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible) $ActionQueueSaveOnShutdown on # save messages to disk on shutdown $ActionQueueType LinkedList # run asynchronously $ActionResumeRetryCount -1 # infinite retries if host is down # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional local0.* @@192.168.0.1:1235 |
1. 在控制台中,使用shift+enter可以输入多行
2. 在network中,对于 content-type: text/html 的请求,如果 body标签中没有内容,Response中就显示为空,给人以没有任何响应的假象,我很不希望这种处理方式,或者再添加一项RawResponse也行
首先,我们给出一段代码:
1 2 3 4 5 6 7 8 9 10 |
function animal(name) { this.say = function() { alert("my name is " + name); } this.init = function() { alert(name + " is created"); return this; } return this.init(); } |
下面有几中使用方式:
1. 直接执行函数,利用函数的返回值
1 2 3 4 5 6 |
var m = animal("m"); m.say(); // 结果: my name is m // 但是,因为animal("m")是在window下执行的,m只是一个返回的对象,说白了, 这里的m就是window, 没有达到封装的目的,所以,不应该让这个函数在window下执行 window.say; // 结果: my name is m |
2. 使用new来创建对象
1 2 |
var n = new animal('n'); // 此时,函数被执行,函数中的this不是window是animal n.say(); // 结果: my name is n |
3. 使用apply来创建对象
1 2 3 |
var x = {}; animal.apply(x,["x"]); //此时的animal被执行,内部的this指的是x,参数以数组的方式传递 x.say(); // 结果: my name is x |
4. 使用call来创建对象
1 2 3 |
var y = {}; animal.call(y,"y"); //此时的animal被执行,内部的this指的是y,参数以数组的方式传递 y.say(); // 结果: my name is y |
使用call和apply的区别在于传递参数的方式不同
结论:
1. 这里面只有第一种使用方法是不可取的(或者说的错误的)
2. 第二种方式容易被覆盖,所以也很少有使用,除非就不期望出现多个相同功能的对象
3. 第三、四种方式都比较容易扩展方法,被广泛使用
4. 这里的 init方法需要根据需要来决定是否公开
记录一个问题:
/var/log/message
Aug 8 17:05:22 localhost kernel: [11476699.354998] TCP: time wait bucket table overflow
当时httpd进程数很大
摘自: http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html
Linux shell在编程方面比windows 批处理强大太多,无论是在循环、运算。已经数据类型方面都是不能比较的。 下面是个人在使用时候,对它在数组方面一些操作进行的总结。
1.数组定义
1 2 3 |
[chengmo@centos5 ~]$ a=(1 2 3 4 5) [chengmo@centos5 ~]$ echo $a 1 |
一对括号表示是数组,数组元素用“空格”符号分割开。
2.数组读取与赋值
得到长度:
1 2 |
[chengmo@centos5 ~]$ echo ${#a[@]} 5 |
用${#数组名[@或*]} 可以得到数组长度
读取:
1 2 3 4 |
[chengmo@centos5 ~]$ echo ${a[2]} 3 [chengmo@centos5 ~]$ echo ${a[*]} 1 2 3 4 5 |
用${数组名[下标]} 下标是从0开始 下标是:*或者@ 得到整个数组内容
赋值:
1 2 3 4 5 6 |
[chengmo@centos5 ~]$ a[1]=100 [chengmo@centos5 ~]$ echo ${a[*]} 1 100 3 4 5 [chengmo@centos5 ~]$ a[5]=100 [chengmo@centos5 ~]$ echo ${a[*]} 1 100 3 4 5 100 |
直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素
删除:
1 2 3 4 5 6 7 8 9 10 |
[chengmo@centos5 ~]$ a=(1 2 3 4 5) [chengmo@centos5 ~]$ unset a [chengmo@centos5 ~]$ echo ${a[*]} [chengmo@centos5 ~]$ a=(1 2 3 4 5) [chengmo@centos5 ~]$ unset a[1] [chengmo@centos5 ~]$ echo ${a[*]} 1 3 4 5 [chengmo@centos5 ~]$ echo ${#a[*]} 4 |
直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据。
3.特殊使用
分片:
1 2 3 4 5 6 7 8 9 10 11 |
[chengmo@centos5 ~]$ a=(1 2 3 4 5) [chengmo@centos5 ~]$ echo ${a[@]:0:3} 1 2 3 [chengmo@centos5 ~]$ echo ${a[@]:1:4} 2 3 4 5 [chengmo@centos5 ~]$ c=(${a[@]:1:4}) [chengmo@centos5 ~]$ echo ${#c[@]} 4 [chengmo@centos5 ~]$ echo {c[*]} 2 3 4 5 |
直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。
替换:
1 2 3 4 5 6 7 8 |
[chengmo@centos5 ~]$ a=(1 2 3 4 5) [chengmo@centos5 ~]$ echo ${a[@]/3/100} 1 2 100 4 5 [chengmo@centos5 ~]$ echo ${a[@]} 1 2 3 4 5 [chengmo@centos5 ~]$ a=(${a[@]/3/100}) [chengmo@centos5 ~]$ echo ${a[@]} 1 2 100 4 5 |
调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。
从上面讲到的,大家可以发现linux shell 的数组已经很强大了,常见的操作已经绰绰有余了。
<canvas>
是一个新的HTML元素,这个元素可以被Script语言(通常是JavaScript)用来绘制图形。例如可以用它来画图、合成图象、或做简单的(和不那么简单的)动画。右面的图象展示了一些<canvas>
的应用示例,我们将会在此教程中看到他们的实现。
<canvas>
最先在苹果公司(Apple)的Mac OS X Dashboard上被引入,而后被应用于Safari。基于Gecko1.8的浏览器,例如Firefox 1.5,也支持这个新元素。元素<canvas>
是WhatWG Web applications 1.0也就是大家都知道的HTML 5标准规范的一部分。
SVG 是Scalable Vector Graphics(可伸缩矢量图形)的首字母缩写,是一种XML语言的矢量图形格式。svg图形非常灵活,可以是静态的,可以是动态的,也可以进行交互或 者动画。svg图形的样式可以通过CSS指定,其动态行为可以利用svg DOM或者javascript实现。此外svg文件中的文字是可以被读取的(这一点对于搜索引擎的优化很有意义)。在html页面中插入svg图形也非常简单。
Canvas与SVG是两种截然不同的在浏览器中呈现丰富图像信息的网络技术,如何在 SVG 和 Canvas 之间进行选择。
本文给出了一些相关资料,里面分析的已经很详细了:
http://technet.microsoft.com/zh-cn/library/gg193983%28v=vs.85%29.aspx
http://blogs.msdn.com/b/weizhong/archive/2011/07/16/canvas-svg.aspx
http://hi.baidu.com/ulquiorra_sifo/item/10db350e7faf0dd42f4c6b52
Canvas教程: https://developer.mozilla.org/zh-CN/docs/Canvas_tutorial
属性 | 描述 | IE | F | O |
---|---|---|---|---|
assign() | 加载新的文档。 | 4 | 1 | 9 |
reload() | 重新加载当前文档。 | 4 | 1 | 9 |
replace() | 用新的文档替换当前文档。 | 4 | 1 | 9 |
assign() 方法可加载一个新的文档。
1 |
location.assign(URL) |
reload() 方法用于重新加载当前文档。
1 |
location.reload(force) |
如果该方法没有规定参数,或者参数是 false,它就会用 HTTP 头 If-Modified-Since 来检测服务器上的文档是否已改变。如果文档已改变,reload() 会再次下载该文档。如果文档未改变,则该方法将从缓存中装载文档。这与用户单击浏览器的刷新按钮的效果是完全一样的。
如果把该方法的参数设置为 true,那么无论文档的最后修改日期是什么,它都会绕过缓存,从服务器上重新下载该文档。
replace() 方法可用一个新文档取代当前文档。
1 |
location.replace(newURL) |
replace() 方法不会在 History 对象中生成一个新的记录。当使用该方法时,新的 URL 将覆盖 History 对象中的当前记录。
1. 如果不期望用户能后退,使用replace(newURL)
2. 如果不期望使用缓存,使用reload(true)
3. 如果期望可以后退,使用assign(newURL)
可以使用 location.href = newURL; 的方式来刷新页面,这个类似于上面的哪一种行为呢?(好像是assign?)
该程序一般安装在: C:\Program Files\Bonjour\mDNSResponder.exe
那么,Bonjour 是个什么东西呢?
Bonjour,原名Rendezvous,是苹果电脑公司在其开发的操作系统Mac OS X10.2版本之后引入的服务器搜索协议所使用的一个商标名。适用于LAN, Bonjour使用多点传送域名系统服务记录来定位各种设备,比如打印机或者其他计算机,以及另外设备上的服务。 Bonjour 一词在法语中是常见问候语,意思为“早安/午安”。
摘自:http://www.williamlong.info/archives/3119.html
相关参考:
http://zh.wikipedia.org/wiki/SPDY
http://www.chromium.org/spdy
http://www.chromium.org/spdy/spdy-proxy-examples
SPDY 是 Google 开发的基于传输控制协议 (TCP) 的应用层协议 ,开发组正在推动 SPDY 成为正式标准(现为互联网草案)。SPDY 协议旨在通过压缩、多路复用和优先级来缩短网页的加载时间和提高安全性。(SPDY 是 Speedy 的昵音,意思是更快)
SPDY 协议只是在性能上对 HTTP 做了很大的优化,其核心思想是尽量减少连接个数,而对于 HTTP 的语义并没有做太大的修改。具体来说是,SPDY 使用了 HTTP 的方法和页眉,但是删除了一些头并重写了 HTTP 中管理连接和数据转移格式的部分,所以基本上是兼容 HTTP 的。
Google 在 SPDY 白皮书里表示要向协议栈下面渗透并替换掉传输层协议(TCP),但是因为这样无论是部署起来还是实现起来暂时相当困难,因此 Google 准备先对应用层协议 HTTP 进行改进,先在 SSL 之上增加一个会话层来实现 SPDY 协议,而 HTTP 的 GET 和 POST 消息格式保持不变,即现有的所有服务端应用均不用做任何修改。
因此在目前,SPDY 的目的是为了加强 HTTP,是对 HTTP 一个更好的实现和支持。至于未来 SPDY 得到广泛应用后会不会演一出狸猫换太子,替换掉 HTTP 并彻底颠覆整个 Internet 就是 Google 的事情了。
距离万维网之父蒂姆·伯纳斯-李发明并推动 HTTP 成为如今互联网最流行的协议已经过去十几年了(现用 HTTP 1.1 规范也停滞了 13 年了),随着现在 WEB 技术的飞速发展尤其是 HTML5 的不断演进,包括 WebSockets 协议的出现以及当前网络环境的改变、传输内容的变化,当初的 HTTP 规范已经逐渐无法满足人们的需要了,HTTP 需要进一步发展,因此 HTTPbis 工作组已经被组建并被授权考虑 HTTP 2.0 ,希望能解决掉目前 HTTP 所带来的诸多限制。而 SPDY 正是 Google 在 HTTP 即将从 1.1 跨越到 2.0 之际推出的试图成为下一代互联网通信的协议,长期以来一直被认为是 HTTP 2.0 唯一可行选择。
HTTP 协议的最大弊端就是每个 TCP 连接只能对应一个 HTTP 请求,即每个 HTTP 连接只请求一个资源,浏览器只能通过建立多个连接来解决。此外在 HTTP 中对请求是严格的先入先出(FIFO)进行的,如果中间某个请求处理时间较长会阻塞后面的请求。
(注:虽然 HTTP pipelining 对连接请求做了改善,但复杂度增加很大,并未普及)
服务端只能等待客户端发送一个请求,在可以满足预加载的现状是一种桎梏。
HTTP 头在同一个会话里是反复发送的,中间的冗余信息,比如 User-Agent、Host 等不需要重复发送的信息也在反复发送,浪费带宽和资源。
SPDY 规定在一个 SPDY 连接内可以有无限个并行请求,即允许多个并发 HTTP 请求共用一个 TCP会话。这样 SPDY 通过复用在单个 TCP 连接上的多次请求,而非为每个请求单独开放连接,这样只需建立一个 TCP 连接就可以传送网页上所有资源,不仅可以减少消息交互往返的时间还可以避免创建新连接造成的延迟,使得 TCP 的效率更高。
此外,SPDY 的多路复用可以设置优先级,而不像传统 HTTP 那样严格按照先入先出一个一个处理请求,它会选择性的先传输 CSS 这样更重要的资源,然后再传输网站图标之类不太重要的资源,可以避免让非关键资源占用网络通道的问题,提升 TCP 的性能。
服务器可以主动向客户端发起通信向客户端推送数据,这种预加载可以使用户一直保持一个快速的网络。
舍弃掉了不必要的头信息,经过压缩之后可以节省多余数据传输所带来的等待时间和带宽。
Google 认为 Web 未来的发展方向必定是安全的网络连接,全部请求 SSL 加密后,信息传输更加安全。
按照 Google 的说法,SPDY 被创造出来的唯一目的就是让 Web 更快(strive to make the whole web fast),其名字 SPDY(Speedy) 也似乎在暗示着这一点。那么 SPDY 的意义又在哪里呢?
对于使用者来说,隐藏在浏览器下面的 SPDY 相比 HTTP 没有任何区别,但是我们可以感觉到 Google 服务在 Chrome 下异常的快,这就是 SPDY 的功劳了。此外网站信息传输加密后不用担心信息被截取等,大大增加了安全性和保密性。
对于前端工程师们来说,提升页面效率是一件很重要的事情,目前大多采用像 CSS Sprites 等方法来优化网站,对于因为页面加载时每张图片、icon 都请求一个连接甚至采用在不同页面引用不同图片来降低一个页面内图片的请求数量。而现在有了 SPDY 的请求优化可以将请求顺序进行重排,这样可以在很大程度上缓解页面加载时图片请求带来的影响。例如像极客公园的报名页面,如果报名用户过多,例如极客公园 2012年创新大会或极客公园第 27 期长城会,可以很明显的感觉出头像的请求会拖累整体页面加载变慢甚至变卡,相信对于这点,经常上淘宝或刷微博的会深有体会,一旦网速稍微慢点就会出现页面 加载异常,还有像苹果 App Store(除去服务器因为地区的延迟),豌豆荚这类应用分发平台上应用图标刷新缓慢等,如下面这个视频所示。
SPDY 在降低连接数目的同时,还使得服务器上每个客户端占用的资源也减少,从而可以释放出更多内存和 CPU 。此外 SPDY 综合起来可以将浏览速度提升一倍,页面加载延迟方面的改进达 64% 。
如果你在使用 Chrome 浏览器,同时使用像 Gmail 等 Google 的网络服务的话,其实你已经不再是通过 HTTP 访问这些服务了。在浏览器打开 chrome://net-internals/#spdy 就会发现你已经在使用 SPDY 协议了。(除了包括 Google 自家的 Gmail、Google Plus 等 Google 系服务外,其他公共站点例如 Twitter 和 Webtide 也已经支持该协议。在国内,基于 WebKit 的豌豆荚 2.0 也曾表示将引进Chrome的SPDY技术来进一步提升速度。
SPDY 的实现需要浏览器客户端和 Web 服务器同时支持。在客户端浏览器这快 Google自家的 Chrome 和Chromium 全系列不用说,都已经支持SPDY; Mozilla 家的 Firefox 自 Firefox 13 也默认开启对 SPDY 的支持。而亚马逊家的 Silk 利用 SPDY 的深度其实不比 Google 自家的 Chrome 和 Firefox 差。
在Web 服务器方面包括最流行和最广泛的 Apache 在内,Netty、Jeety、Varnish、Erlang 和 Hightide 应用服务器以及面向 node.js 的服务器也都已经宣布支持 SPDY。( Nginx 也表示将支持 SPDY)
近日 Google 正式发布了适用于最流行 Web 服务器 Apache 的插件 mod_spdy,将其下载安装后你的 Apache 服务器就能使用 SPDY 协议与兼容 SPDY 协议的浏览器如 Chrome、FireFox 等进行通信。像之前所说的那样,SPDY 是运行在 HTTPS 上,非 HTTPS 流量并不会受到 mod_spdy 影响。
1. Apache 2.2 (≥2.2.4)
2. mod_ssl 模块开启
到下载页面下载对应系统的安装包
在系统终端运行下面命令行
dpkg -i mod-spdy-*.deb
apt-get -f install-系统为 Debian/Ubuntu
————————————————————
yum install at (if you do not already have ‘at’ installed)
rpm -U mod-spdy-*.rpm-系统为 CentOS/Fedora
sudo /etc/init.d/apache2 restart (Debian/Ubuntu)
打开 Chrome 浏览器,输入并前往 chrome://net-internals/#spdy 页面,查看主机名称是否出现在标识栏中。如果出现说明已经部署完毕,如果没有出现去服务器错误日志(error.log)里查询。
在最新的协议文档里 Google 重新将 SPDY 分为了两层,其中一层被描述为 HTTP-like,大有取代 HTTP 的意图(Google 最近的一篇文章已经直呼 SPDY 为“a replacement for HTTP”)。同时 HTTP 2.0 标准制定工作组(HTTPbis)也表示,SPDY 很有希望接替当前的 HTTP 传输实现。
考虑到 Chrome 和安卓的份额以及标准的推动,相信 SPDY 会有一个好前景。因此选择此刻支持 SPDY 也是明智的选择。
附:
浏览器是如何探测web server是否支持SPDY的?
The way Chrome achieves this backward-compatibility is by using the SSL Next Protocol Negotiation (NPN) extension during SSL handshaking. When the browser is establishing an SSL session, it mentions to the server that it’s willing to speak SPDY (as part of the ClientHello message). If the server also speaks SPDY, it can communicate that fact back to the client. If the client sees that the server supports SPDY, it proceeds to send SPDY messages over the newly established connection once the SSL handshaking is complete. Otherwise, it sends HTTP messages. The cool thing about this approach is that it doesn’t add any additional network round trips.
摘自: http://news.ycombinator.com/item?id=3030164
思考:
在使用负载均衡的情况下,spdy会有什么问题吗?