来源于群分享:

协议
---------------------------------------------------------
Memcache客户端通过TCP连接与服务器进行通信(UDP接口也是可用的,在下文的"UDP协议"部分有详细描述)。Memcache服务器在一个(可配置的)端口上监听;客户端连接该端口,发送命令到服务器,读取响应,最后关闭连接。
终止会话是没有必要发送命令的:如果不需要该连接,客户端任何时候都可以将其关闭。但即便是这样,客户端最好还是缓存连接,而不是在要存取数据时再打开连
接。这是由于memcache被特意设计成可以处理大量(数百个,需要的话可以上千个)打开的连接。缓存这些连接会减少建立TCP连接所带来的开销(相对
于此,在服务器端建立一个新连接的准备工作所带来的开销,可以忽略不计)。
在Memcache协议中发送的数据分两种:文本行和非结构数据(unstructured
data)。由客户端发送的命令和服务器端的响应使用的是文本行。非结构数据用于客户端存储数据的时候。服务器会将接收到的非结构数据,
以字节流的形式原样返回。服务器并不关心在非结构数据中的字节序的问题。对于非结构数据中的字符没有任何限制,但数据的读取方(客户端或服务器)需要通过
一个文本行数据,得知正在传输的数据块的精确长度。
文本行总是以/r/n结束,非结构数据也总以/r/n结束, 但/r, /n或者其它的8位字符也可能出现在数据中,所以当客户端从服务器读取数据时,必须使用所提供数据长度来决定数据何时结束,而不是基于/r/n在数据块的结束处。
键(Keys)
在Memcache中存储的数据是以键来标识的。键是一个全局唯一的文本串标识,客户端通过经来存取所需的数据。当前,键的长度限制是250个字符(当然,通常来说客户端并不需要使用那么长的键)。键不参包含控制字符和空格。
命令(Commands)
存储命令(有6个: "set", "add" ,"replace", "append", "prepend" 和 "cas")要求服务器存储以键标识的数据。客户端发送一个命令行,然后是一个数据块;之后客户端等待一个表示成功/失败的响应行。
提取命令(有两个:"get"和"gets")
要求服务器提取一个键集(一次请求一个或多个键)的数据。客户端发送一个包含所有请求键的命令行。对于每一个数据项,服务器查找到后,发送一个响应行到客
户端,内含该数据项的信息,后跟该数据项的数据,直到服务器发送了一个"END"响应行,表示整个过程的结束。
命令行总是以命令行开头,后跟以空格分隔的参数(如果有的话)。命令行是小写的并且大小写敏感。
过期时限(Expiration times)
---------------------------------------------------------
客户端发送给服务器的某些命令可以带有(一个数据项或一个客户端请求操作的)过期时限信息。在这些情况下,发送的实际值可以是Unix时间(自1970年1月1日至今的秒数,32位值),或是从当前起的秒数。在后一种情况下,秒数不能超过60*60*24*30(30天的秒数)。如果客户端发送的数值超过此值,服务器会认为它是一个Unix时间值,而不是距当前时间的偏移值。
出错字符串(Error strings)
---------------------------------------------------------
客户端发送的每一个命令,服务器可能会发送一个出错字符串作为响应。这些出错字符串有三种类型:
"ERROR/r/n"
表示客户端发送了一个不存在的命令
"CLIENT_ERROR <error>/r/n"
表示客户端的输入行出现了某些错误,例如,输入行没有遵从协议。<error>是一个可读的错误描述。
"SERVER_ERROR <error>/r/n"
表示服务器的一些错误导致服务器不能执行该命令。<error>是一个可读的出错描述字符串。如果出现了使服务器无法继续为客户端服务的服务器错误(这一般不应发生),服务器在发送完错误字符串后会关闭连接。这是服务器端关闭客户端连接的唯一情况。
在以下的每个命令描述中,错误行不会再次提及,但客户端必须考虑到它们可能会出现。
存储命令
---------------------------------------------------------
首先,客户端发送一个类似这样的命令行:
<command name> <key> <flags> <exptime> <bytes> [noreply]/r/n
cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]/r/n
<command> 有 "set ", "add ", "replace", "append" 和 "prepend":
"set" 存储这个数据。
"add" 只在服务器没有存储该Key的数据的情况下存储这个数据。
"replace" 只在服务器存储了该Key的数据的情况下存储这个数据。
"append" 为一个已存在的Key的数据尾部追加该部分的数据。
"prepend" 为一个已存在的Key的数据在头部添加该部分的数据。
append和prepend命令不接受flag和exptime,它们更新已存数据,而忽略新的flag和exptime设置。
cas是一个检查并设置的操作,意思是"存储这个数据,但只有在自我上次取得该数据以来没有人再更新该数据的情况下才存储"。
<key>:客户端要求存储的数据键值
<flags>:一个可选的16位无符串整数(以十进制形式写入),服务器会在取回该数据项时一同原样返回。客户端可以将其用作一个位存储域来存储一些数据特征信息。这个域对服务器是透明的。注意在memcached 1.2.1和更高版本,flags可以是32位的,而不是16位,不过你或许会限制使用16位来兼容旧版本。
<exptime>:过期时间。如果设置为0,
则该数据项永不过期(尽管如此,它还是可能从缓存中被删除掉,以为其它数据项腾出空间)。如果它不为0(或者是Unix
时间,或者是相当于当前时间的偏移值), 它可以保证在过期时间到后,客户端不会查询到该数据(用服务器时间度量)。
<bytes>:后跟数据的字节长度,没有计算作为分隔符的/r/n. <bytes>可能为0 (在这种情况下,它后跟一个空的数据块)。
<cas unique> 是一个与已存数据条目相关的全局唯一的64位数。客户端应该使用"gets"命令返回的该值来进行"cas"更新操作。
"noreply" 可选项指示服务器不要回送响应。注意:如果请求行格式错误,服务器不一定能可靠地解析"noreply"选项。在此种情况下,它可能会发送错误信息给客户端,如果客户端没有读取该信息的话会带来问题。客户端应该只构造合法的请求。
在此行后,客户端发送数据块。
<data block>
<data block>是一个任意的8位字节数据块,长度为前面一行所指定的数据长度<bytes>。
在发送了该命令行和数据块后,客户端等待可能的响应:
"STORED/r/n", 指示成功
"NOT_STORED/r/n" 指示数据没有被存储,但不是出错。这通常是表示"add"或"replace"的条件没有满足。
"EXIST/r/n" 指示使用"cas"命令所要更新的数据自你上次取过后已经过修改。
"NO_FOUND/r/n" 指示你用"cas"命令要修改的数据并不存在。
数据提取命令
---------------------------------------------------------
数据提取命令有"get"和"gets",如:
get <key>*/r/n
gets <key>*/r/n
<key>* 表示一个或多个由空格分隔的key串
在这个命令后,客户端期待零个或多个数据项,每个接受到的数据项是一个文本行,后跟数据块。当所有数据项传送完后,服务器发送一个"END/r/n"指示响应的终止。
每一个由服务器发送的数据项如下所示:
VALUE <key> <flags> <bytes> [<cas unique>]/r/n
<data block>/r/n
<key>: 数据项的Key值
<flags>:由存储命令设置的flags
<bytes>:是后跟数据块的长度,没有包括作为分隔符的/r/n
<cas unique>:是一个64位整数,唯一标识了一个特定的数据项。
<data block>:数据项的数据
如果有某些在请求中出现的Key没有服务器没有在数据项列表中回送,表示服务器没有这些Key的数据项(因为它们没有被存储过,或者删除以为其它数据项腾出空间,或者过期了,又或者被客户端的delete 操作删除了)。
删除
---------------------------------------------------------
delete命令允许显式删除数据项:
delete <key> [noreply]/r/n
<key>:客户端要求服务器删除的数据项的key值
"norply":可选参数指示服务器不要回送响应。参见存储命令中对格式错误请求的说明。
这个命令的响应行可能是以下的一个:
"DELETED/r/n" 指示成功
"NOT_FOUND/r/n" 指示Key所指的数据项不存在。
参见下文的"flush_all"命令,该命令使所有数据项立即无效。
递增/递减
---------------------------------------------------------
incr 和decr命令用来原地改变某些数据项,递增或递减其值。数据项的数据被看作是64位的无符号十进制整数。如果当前的数据值不能转换为这样一种表示,则 incr/decr命令返回一个错误(memcached <= 1.2.6将这种伪值(bogus value)看成是0, 这会导致混乱)。另外,这个数据项必须已存在使得 incr/decr能工作。这些命令不会假设一个不存在的key数值为0,而是会失败。
客户端发送的命令行如下:
incr <key> <value> [noreply]/r/n
或
desc <key> <value> [noreply]/r/n
<key>:客户端想改变的数据项的key值
<value>:客户端要对数据项递增/递减的值。它是一个64位的无符号十进制整数。
"norply":可选参数指示服务器不要回送响应。参见存储命令中对格式错误请求的说明。
响应可能是以下之一:
"NOT_FOUND/r/n" 指示这个数据项找不到。
"<value>/r/n", 其中<value>是这个数据项在经过递增/递减操作后的新值。
注意: 如果"desc"命令捕获到下溢异常:如果客户端尝试将一个值减少到小于0, 新值将会是0. "incr"命令的上溢异常会经64位回绕(wrap around the 64 bit mark)。【译者注:即 (原值+value) & 0xffffffffffffffff】.
同样要注意的是减少一个数值使得其实际长度减少了,但并不保证其返回长度值的减少。这个数值可能会在尾部加上空格,但这纯属一个实现上的优化手段,所以你不能依赖它。
统计
---------------------------------------------------------
"stats" 命令用于查询服务器维护的一些统计数据和内部数据。它有两种形式。不用参数:
stats/r/n
它使服务器输出常规统计和设置,下文中有说明。 另一种形式带有参数:
stats <args>/r/n
根据 <args> ,服务器会返回不同的内部数据。参数的类型和发送的数据没有在这个版本的协议中说明,这有利于memcache开发者(对代码)进行更改。
常规统计
当接收到不带参数的"stats"命令后, 服务器发送若干行数据,如下所示:
STAT <name> <value>/r/n
服务器用以下行作为终结:
END/r/n
在每一行统计数据中, <name>是统计项的名称,<value>是统计值。在以下的列表中有对"stats"命令响应的所有统计名称,和这个统计项的类型,以及这个值的意义。
在下面的类型列中,"32u" 表示32位无符号整数,"64u"表示64位无符号整数,"32u.32.u"表示两个由分号分隔的32位无符号整数(当作是浮点数)。
|
名称 |
类型 |
含义 |
|
pid |
32u |
服务器进程的id |
|
uptime |
32u |
自服务器启动以来的秒数 |
|
time |
32u |
服务器上的UNIX时间 |
|
version |
string |
服务器的版本 |
|
pointer_size |
32 |
主机操作系统的默认指针长度(一般是32或64) |
|
rusage_user |
32u.32u |
进程用户空间的累计时长(秒:微秒) |
|
rusage_system |
32u.32u |
进程内核空间的累计时长 (秒:微秒) |
|
curr_items |
32u |
当前存储的数据项数目 |
|
total_items |
32u |
自服务器启动以来存储的数据项总数(译者注:其实就是成功执行存储命令(STORED)的计数) |
|
bytes |
64u |
当前用于存储数据项所用的字节数 |
|
curr_connections |
32u |
打开的连接数 |
|
total_connections |
32u |
自服务器启动以来的打开的连接数 |
|
connection_structures |
32u |
服务器分配的连接结构的数目 |
|
cmd_get |
64u |
提取命令的累计数目 |
|
cmd_set |
64u |
存储命令的累计数目(译者注:也包括NOT_STORED的) |
|
get_hits |
64u |
请求并找到的数据项的数目 |
|
get_missed |
64u |
请求但找不到的数据项的数目 |
|
delete_missed |
64u |
删除无效key的请求数 |
|
delete_hits |
64u |
使得数据项删除的删除请求数目 |
|
incr_missed |
64u |
没有找到key的incr请求数 |
|
incr_hits |
64u |
成功的incr请求数 |
|
decr_misses |
64u |
没有找到key的decr请求数 |
|
decr_hits |
64u |
成功的decr请求数 |
|
cas_misses |
64u |
没有找到key的CAS请求数 |
|
cas_hits |
64u |
成功CAS请求数 |
|
cas_badval |
64u |
key存在但CAS值不匹配的CAS请求的数目 |
|
auth_cmds |
64u |
认证命令处理的次数,包括成功和失败 |
|
auth_errors |
64u |
身份认证失败的数目 |
|
evictions |
64u |
从缓存中移除数据项来为新数据项腾出空间的数目 |
|
reclaimed |
64u |
利用一个过期数据条目来存储新数据条目的数目 |
|
bytes_read |
64u |
本服务器从网络中读取的字节总数 |
|
bytes_written |
64u |
本服务器发送到网络的字节总数 |
|
limit_maxbytes |
32u |
本服务器允许使用的内存字节数 |
|
threads |
64u |
请求的工作线程数(参见 doc/threads.txt) |
|
conn_yields |
64u |
由于达到-R选项指定数目的限制,一个连接的操作主动放弃让给另一个连接的数目 |
设置项统计
警告:这部分所描述的统计项以后可能会有变更。
带有"settings" 的 "stats"命令返回memcached的设置细节。这基本上就是由进程命令行的选项所组成的。注意这里不保证统计项的次序,列表也不一定是详尽的。除此之外,它的返回结果与其它的stats命令是一样的。
|
名称 |
类型 |
含义 |
|
maxbytes |
size_t |
缓存中的最大字节数 |
|
maxconns |
32 |
最大的并发客户端数 |
|
tcpport |
32 |
TCP监听端口 |
|
udpport |
32 |
UDP监听端口 |
|
inter |
string |
监听地址 |
|
verbosity |
32 |
0=无, 1=部分, 2=很多 |
|
oldest |
32u |
最老对象的时长 |
|
evictions |
on/off |
当为off时,LRU清除策略禁用 |
|
domain_socket |
string |
Unix socket的文件路径 |
|
umask |
32 (oct) |
Unix socket 的屏蔽字 |
|
growth_factor |
float |
Chunk大小的增长因子 |
|
chunk_size |
32 |
为 key+ value + flag分配的最小空间 |
|
num_threads |
32 |
线程数(包括分派线程) |
|
stat_key_prefix |
char |
统计前缀分隔符 |
|
detail_enabled |
bool |
如果为真,启用统计细节 |
|
reqs_per_event |
32 |
在一个事件处理里的最大IO请求数 |
|
cas_enabled |
bool |
当为假时,CAS会被禁用 |
|
tcp_backlog |
32 |
TCP 监听backlog值 |
|
auth_enabled_sasl |
yes/no |
是否使用SASL |
数据项统计
警告: 这部分所描述的统计项以后可能会有变更。
带有“items”选项的"stats"命令返回每个slab class的item存储信息。返回的数据格式:
STAT items:<slabclass>:<stat> <value>/r/n
服务器使用以下行终止这个列表:
END/r/n
<slabclass>和 "stats slabs"命令使用的类id是一致的。"stats slabs"描述内存的大小和使用率, "stats items"描述更上一层的信息。
以下的项的值被定义为
|
名称 |
含义 |
|
number |
当前存储在这个class中的item数.过期的item不会自动排除 |
|
age |
在LRU中最老的item |
|
evicted |
不得不从LRU中移除未过期item的次数 |
|
evicted_nonzero |
过期时间设置不为0,但不得不从LRU中称除该未过期的item的次数 |
|
evicted_time |
自最后一次清除过期item起所经历的秒数。用这个来判断数据被移除的最近时间 |
|
outofmemory |
slab class为新item分配空间失败的次数。这意味着你运行时带上了-M或者移除操作失败 |
|
tailrepairs |
自解决slab 引用泄漏问题的次数。如果这个计数器增长很多,请将你的情况告诉开发者 |
|
reclaimed |
用一个过期的数据条目存储新一个数据条目的次数 |
注意仅仅会显示存在的slab的信息,因此对于空的缓存会返回空集。
Item大小统计
警告: 这部分所描述的统计项以后可能会有变更。
带有"sizes"选项的"stats"命令返回缓存中全部数据的一般大小和数目。
警告:这个命令会对缓存上锁!它会遍历每一个数据项并检查其大小。
尽管这个操作很快,但如果你有很多数据项,你会阻止其它的请求几秒。
数据的返回格式如下所示:
<size> <count>/r/n
服务器以下面的行来终止列表:
END/r/n
"size"是数据项的大约大小,在32字节内
"count"是在该32字节范围的数据项的数目。
这使我们了解到对于所有的item,是否都有一个相应32字节长度内的slab class。你可以以此来决定如何调整slab增长因子来减少内存开销。例如:如果大部分的item都小于200字节,在小容量的范围中产生更多的 class可以使得item在slab中的分配更紧凑。
Slab 统计
警告: 这部分所描述的统计项以后可能会有变更。
带有"slabs"选项的"stats"命令返回在运行期memcache建立的每一个slab的信息。这包括每个slab的信息和一些总计信息。返回数据的格式为:
STAT <slabclass>:<stat> <value>/r/n
STAT <stat> <value>/r/n
服务器以下面的行终止列表:
END/r/n
|
名称 |
含义 |
|
chunk_size |
每一个chunk占用的空间。一个item会使用一个合适大小的chunk来存储 |
|
chunk_per_page |
一个页中有多少个chunk.一个页的大小默认是小于等于1M。Slab在页中分配,然后分割成chunk |
|
total_pages |
为该slab class分配的页数 |
| total_chunks |
为该slab class分配的chunk数 |
|
get_hits |
在该class中数据提取请求(命中)的总数 |
|
cmd_set |
在该class 中数据存储请求的总数 |
|
delete_hits |
在该class 中成功删除数据的总数 |
|
incr_hits |
在该class中递增操作的总数 |
| decr_hits | 在该class中递减操作的总数 |
| cas_hits | 在该class中CAS命令更新的总数 |
| cas_badval | 在该class中因不匹配的CAS id而失败而导致更新失败的CAS命令的总数 |
| used_chunks | 有多少个chunk用于分配item |
| free_chunks | 还没有用于item分配,或因删除变空闲的chunk数目 |
| free_chunks_end | 在最近分配的Page尾部空闲chunk的数目 |
| mem_requested | 在该slab 中申请分配的内存字节数 |
| active_slabs | slab class分配的总数 |
| total_malloced | 分配的slab page内存量 |
Item存储于与大于等于其大小的slab中。mem_request显示在一个slab中所有内存请求的总大小(total_chunks * chunk_size)- mem_requestd 显示该slab浪费的内存数。如果你看到有大量的浪费,考虑调slab 增长因子。
其它命令
---------------------------------------------------------
"flush_all" 命令带有一个可选的数目参数。它总是成功,服务器返回"OK/r/n"作为响应(除非在最后一个参数中指定了"noreply")。它的作用是使得所有现存的item立即无效(默认)或者在一个指定的时间后无效。在失效操作后,不会有item作为响应返回给数据提取命令(除非它在flush_all操作后又在相同的key中存储了一次)。flush_all实际上并没有释放item占用的所有的内存,它们会逐渐被用于存储新的item。flush_all 最精确的定义如下:它使得所有最后更新时间小于flush_all指定的时间的item在提取操作中被忽略。
带延迟的flush_all的目的在于,当你设置了一个memcache服务池,而且要清除所有内容,你可以选择不要同时重置所有的memcache服务
(例如这会使所有客户端原本从memcache中取得的数据,现在要由数据库重新生成而导致数据库负担的突然加重)。
这个延迟选项允许你以10秒的间隔来重置它们(例如,第一个10秒后,第二个20秒后,第三个......)
"version"命令没有参数:
version/r/n
在响应中,服务器返回:
"VERSION <version>/r/n", 其中<version>该服务器的版本字符串。
"verbosity"是一个带一个数目参数的命令。它总是成功,服务器返回"OK/r/n"作为响应(除非在最后一个参数指定了noreply).它的作用是设置日志输出的显示级别。
"quit"命令没有任何参数:
quit/r/n
当收到该命令时, 服务器端关闭连接。但客户端也可以在它不需要该连接时将其简单地关闭,不用发送任何命令。
UDP协议
---------------------------------------------------------
对于客户端的数目非常多的情况下,TCP连接数限制了扩展性。也有一个基于UDP的接口。UDP接口不提供可靠传输, 所以只应用于不需要保证成功的操作中;典型的情况是在"get"请求时,一个丢失或不完整的响应会简单地被认为是缓存不命中。
每一个UDP数据报包含一个简单的帧头,后跟与上述TCP协议一样格式的数据。在当前的实现中,请求必须在一个UDP数据报中,但响应可以跨多个数据报
(一般仅用于在多个key的"get"和"set"请求中。考虑到可靠性,这两种请求其实还是用TCP传输比较合适)。
帧头是8个字节的长度,如下所示(所有的值都是16位整数,网络字节序,高位在前)
0-1 请求ID
2-3 序列号
4-5 该消息包含的数据报数目
6-7 保留字段,必须为0
请求ID由客户端提供,典型是使用一个基于某个随机数的自增序列,但客户端可以自由决定请求ID。服务器的响应中会包含与请求相同的ID。客户端使用请求
ID来区分不同来自同一个服务器的对不同请求的响应。那些带有不能识别的请求ID的响应可能是对之前请求的延迟响应,应该丢弃。
序列号是范围是从0到n-1, 这里的n是该消息的数据报总数。客户端应该将数据报的负载部分以序列号顺序进行连接。合并字节流的结果与TCP协议(包含结束符/r/n)的格式一致。
摘自: http://www.cnblogs.com/warriorlee/archive/2011/09/18/2180661.html
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip
\Parameters] TcpNumConnections = 0x00fffffe (Default = 16,777,214)
以上注册表信息配置单机的最大允许的TCP连接数,默认为 16M。这个数值看似很大,这个并不是限制最大连接数的唯一条件,还有其他条件会限制到TCP 连接的最大连接数。
TCP客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为 1024-5000 ,也就是说默认情况下,客户端最多可以同时发起3977 个Socket 连接。我们可以修改如下注册表来调整这个动态端口的范围
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters] MaxUserPort = 5000 (Default = 5000, Max = 65534)
系统为每个TCP 连接分配一个TCP 控制块(TCP control block or
TCB),这个控制块用于缓存TCP连接的一些参数,每个TCB需要分配 0.5 KB的pagepool 和 0.5KB
的Non-pagepool,也就说,每个TCP连接会占用 1KB 的系统内存。
系统的最大TCB数量由如下注册表设置决定
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip
\Parameters] MaxFreeTcbs = 2000 (Default = RAM dependent, but usual Pro =
1000, Srv=2000)
非Server版本,MaxFreeTcbs 的默认值为1000 (64M 以上物理内存)
Server 版本,这个的默认值为 2000。
也就是说,默认情况下,Server 版本最多同时可以建立并保持2000个TCP 连接。
TCB 是通过Hash table 来管理的,下面注册表设置决定了这个Hash table 的大小
HKEY_LOCAL_MACHINE \System \CurrentControlSet \services \Tcpip
\Parameters] MaxHashTableSize = 512 (Default = 512, Range = 64-65536)
这个值指明分配 pagepool 内存的数量,也就是说,如果MaxFreeTcbs = 1000 , 则 pagepool 的内存数量为 500KB
那么 MaxHashTableSize 应大于 500 才行。这个数量越大,则Hash table 的冗余度就越高,每次分配和查找 TCP 连接用时就越少。这个值必须是2的幂,且最大为65536.
TcpTimedWaitDelay
微軟建議最低可設定續存時間為 30 秒,而且也提到設定 30 秒應該不會出問題,因此我幾乎都只設定 30 秒而已:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e
MaxUserPort = 65534 (Decimal)
MaxHashTableSize = 65536 (Decimal)
MaxFreeTcbs = 16000 (Decimal)
这里 MaxHashTableSize 被配置为比MaxFreeTcbs 大4倍,这样可以大大增加TCP建立的速度。
linux copy
/etc/udev/rules.d/
70-persistent-net.rules
来源:http://m.blog.csdn.net/article/details?id=50864933
Redis 3.0.7版本启动时出现警告的解决办法
7283:M 12 Mar 12:13:33.749 # WARNING: The
TCP backlog setting of 511 cannot be enforced because
/proc/sys/net/core/somaxconn is set to the lower value of 128.
7283:M 12 Mar 12:13:33.749 # Server started, Redis version 3.0.7
7283:M 12 Mar 12:13:33.749 # WARNING
overcommit_memory is set to 0! Background save may fail under low memory
condition. To fix this issue add 'vm.overcommit_memory = 1' to
/etc/sysctl.conf and then reboot or run the command 'sysctl
vm.overcommit_memory=1' for this to take effect.
7283:M 12 Mar 12:13:33.749 * The server is now ready to accept connections on port 6379
第1个警告(WARNING: The TCP backlog setting of 511 ......)解决办法
方法1: 临时设置生效: sysctl -w net.core.somaxconn = 1024
方法2: 永久生效: 修改/etc/sysctl.conf文件,增加一行
net.core.somaxconn= 1024
然后执行命令
sysctl -p
补充:
net.core.somaxconn是linux中的一个kernel参数,表示socket监听(listen)的backlog上限。
backlog是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。
而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。
当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
所以说net.core.somaxconn限制了接收新 TCP 连接侦听队列的大小。
对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。
第2个警告(WARNING overcommit_memory is set to 0! ......)同样也有两个解决办法
方法1: 临时设置生效: sysctl -w vm.overcommit_memory = 1
方法2: 永久生效: 修改/etc/sysctl.conf文件,增加一行
vm.overcommit_memory = 1
然后执行命令
sysctl -p
补充:
overcommit_memory参数说明:
设置内存分配策略(可选,根据服务器的实际情况进行设置)
/proc/sys/vm/overcommit_memory
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
注意:redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存
为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里
比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。
Google Chrome
Google Chrome 中在开发者工具中看不到 HTTP/2 指示器。
Chrome 用特殊的地址
chrome://net-internals/#http2 给出了相关信息。
chrome://net-internals/#events&q=id:336
配置windows7/windows 2008 支持ats
苹果提出的ATS强制标准:
部署服务器SSL证书,启用HTTPS加密连接。但需满足以下ATS默认的安全要求:
1、ATS要求服务器必须支持传输层安全(TLS)协议1.2以上版本;
2、通讯中的加密套件配置要求支持列出的正向保密;(以下Apple官方文档列表)
3、数字证书必须使用SHA256或者更高级的签名哈希算法签名,并且保证密钥是2048位及以上的RSA密钥或者256位及以上的ECC算法。
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
DSA算法要求使用以下加密套件:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
支持ATS标准:
1、购买苹果信任CA所颁发的证书;
2、部署https网站的web服务器也有一定要求,如下:
Apache,Nginx要求关联的openssl版本在1.0.1+,这样网站才支持TLS1.2,同时您需要对证书相关参数做一定调整:
Apache:
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL;
Nginx:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL;
Tomcat要求环境 tomcat7+和JDK1.7+,配置参考如下:
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="keystore/domain.jks" keystorePass="证书密码"
clientAuth="false" sslProtocol="TLS"
ciphers="TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
SSL_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" />
IIS 要求环境 windows server 2008 R2/IIS 7+
Apple Documents:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW57
Requirements for Connecting Using ATS
Windows 安全通告:
https://technet.microsoft.com/en-us/library/security/3042058.aspx
Microsoft Security Advisory 3042058
https://support.microsoft.com/en-us/help/3042058/microsoft-security-advisory-update-to-default-cipher-suite-priority-order-may-12,-2015
在安装3042058之前可能需要先确定安装了: KB3020369
https://support.microsoft.com/en-us/help/3020369/april-2015-servicing-stack-update-for-windows-7-and-windows-server-2008-r2
其它相关链接
https://support.microsoft.com/en-us/help/947821/fix-windows-update-errors-by-using-the-dism-or-system-update-readiness-tool
https://help.aliyun.com/knowledge_detail/48151.html
|
Cipher Suites Added by the Update |
|
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 |
|
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 |
|
TLS_RSA_WITH_AES_256_GCM_SHA384 |
|
TLS_RSA_WITH_AES_128_GCM_SHA256 |
windows iis:
开启TLS 1.2
在Windows 2012中,缺省就已经开启了TLS 1.2,但在Windows 2008中缺省并没有开启TLS 1.2,所以需要我们通过修改注册表来启动TLS 1.2功能。
点击“开始”—“运行”,输入 “Regedit”,点击OK.
在注册表中寻找:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server
如果在Protocols下没有“TLS 1.2”选项,请依次新建“TLS 1.2”和“Server”项。
新建一个DWORD值,在名称中输入“Enabled”。
双击这个值,在数值数据中,输入“1”。
调整IIS加密套件顺序
1. Windows 2008在命令提示符下,键入 gpedit.msc,并按 Enter 键来启动“本地组策略编辑器”。
2. 依次展开“计算机配置”、“管理模板”、“网络”,然后单击“SSL 配置设置”。
3. 在“SSL 配置设置”下,单击“SSL 密码套件顺序”设置。
4. 在“SSL 密码套件顺序”窗口中,单击“已启用”。
5. 在选项窗格中,双击以突出显示“SSL 密码套件”字段的全部内容,然后使用以下加密套件替换其内容:
| TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384_P256 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384_P384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P384 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384 TLS_RSA_WITH_AES_256_GCM_SHA384 TLS_RSA_WITH_AES_128_GCM_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA256 TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_3DES_EDE_CBC_SHA |
https://support.microsoft.com/en-us/help/245030/how-to-restrict-the-use-of-certain-cryptographic-algorithms-and-protocols-in-schannel.dll
| Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server] |
| Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 128/128] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 64/128] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 56/128] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 40/128]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 128/128] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 56/128] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 40/128] |
|
Protocol |
KEA |
SYM (bit) |
HSH (bit) |
CipherSuite |
|
TLS1.0 |
RSAKeyX |
AES (128) |
SHA1 (160) |
TLS_RSA_WITH_AES_128_CBC_SHA |
|
SSL3.0 |
RSAKeyX |
RC4 (128) |
SHA1 (160) |
SSL_RSA_WITH_RC4_128_SHA |
|
SSL2.0 |
RSAKeyX |
RC4 (128) |
MD5 (128) |
SSL_CK_RC4_128_WITH_MD5 |
Lets see if there are any ways to use TLS 1.2 by .Net 4.0 apps.
Now its the matter of changing the default protocol used by 4.0 to TLS
1.2. This can be done by forcefully changing the protocol as below.
//SecurityProtocolType.Tls1.2;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls;
// comparable to modern browsers
var request = WebRequest.Create("https://www.howsmyssl.com/a/check");
var response = request.GetResponse();
var body = new StreamReader(response.GetResponseStream()).ReadToEnd();
If we look at the SecurityProtocolType enum for .Net 4.0, we will not be able to see the TLS1.2. But in 4.5 we can see that. So .Net 4.0 will not compile if we use TLS1.2 enum value. But if we use the TLS1.2 enum number it will compile and at runtime since the .Net 4.0's System.dll is replaced with 4.5 the cast will work.
Please note that this will fail if we are running the same app in a machine which don't have 4.5 installed. Recommended only for servers where its easy to manage the .Net version.
If we inspect the .Net 4.5 ServicePointManager source code we can see that the default protocol is depending on the below registry entry.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
SchUseStrongCrypto to DWORD 1
The default value will be 0. Simply change this to 1 to get .Net 4.5
System.dll use TLS 1.2. Since our 4.0 application uses 4.5 System.dll
4.0 gets TLS 1.2 support.
http://stackoverflow.com/questions/28286086/default-securityprotocol-in-net-4-5
https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet#Client_.28Browser.29_Configuration
https://www.simple-talk.com/dotnet/.net-framework/tlsssl-and-.net-framework-4.0/
https://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.110).aspx
https://istlsfastyet.com/
http://blogs.msdn.com/b/benjaminperkins/archive/2014/11/04/using-tls-1-2-with-wcf.aspx
http://blogs.msdn.com/b/benjaminperkins/archive/2011/10/07/secure-channel-compatibility-support-with-ssl-and-tls.aspx
http://www.dotnetnoob.com/2013/10/hardening-windows-server-20082012-and.html
TLS Cipher Suites in Windows 7
https://msdn.microsoft.com/en-us/library/windows/desktop/mt767780%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 8
https://msdn.microsoft.com/en-us/library/windows/desktop/mt762882%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 8.1
https://msdn.microsoft.com/en-us/library/windows/desktop/mt767781%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 10 v1507
https://msdn.microsoft.com/en-us/library/windows/desktop/mt767769%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 10 v1511
https://msdn.microsoft.com/en-us/library/windows/desktop/mt767768%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 10 v1567
https://msdn.microsoft.com/en-us/library/windows/desktop/mt490158%28v=vs.85%29.aspx
for .net framework 4.5
下载地址:
命令行: http://nuget.codeplex.com/downloads/get/669083
命令行: http://nuget.org/downloads
图形窗: https://github.com/NuGetPackageExplorer
*.nuspec
| Folder | Description | Action upon package install |
|---|---|---|
| tools | Powershell scripts and programs accessible from the Package Manager Console | Contents are copied to the project folder, and the tools folder is added to the PATH environment variable. |
| lib | Assembly(.dll) files (.dll), documentation (.xml) files, and symbol (.pdb) files | Assemblies are added as references; .xml and .pdb copied into project folders. |
| content | Arbitrary files | Contents are copied to the project root |
| build | MSBuild .targets and .props files | Automatically inserted into the project file (NuGet 2.x) or project.json.lock (NuGet 3.x). |
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<!-- The identifier that must be unique within the hosting gallery -->
<id>Contoso.Utility.UsefulStuff</id>
<!-- The package version number that is used when resolving dependencies -->
<version>1.8.3.331</version>
<!-- Authors contain text that appears directly on the gallery -->
<authors>Dejana Tesic, Rajeev Dey</authors>
<!-- Owners are typically nuget.org identities that allow gallery
users to earily find other packages by the same owners. -->
<owners>dejanatc, rjdey</owners>
<!-- License and project URLs provide links for the gallery -->
<licenseUrl>http://opensource.org/licenses/MS-PL</licenseUrl>
<projectUrl>http://github.com/contoso/UsefulStuff</projectUrl>
<!-- The icon is used in Visual Studio's package manager UI -->
<iconUrl>http://github.com/contoso/UsefulStuff/nuget_icon.png</iconUrl>
<!-- If true, this value prompts the user to accept the license when
installing the package. -->
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<!-- Any details about this particular release -->
<releaseNotes>Bug fixes and performance improvements</releaseNotes>
<!-- The description can be used in package manager UI. Note that the
nuget.org gallery uses information you add in the portal. -->
<description>Core utility functions for web applications</description>
<!-- Copyright information -->
<copyright>Copyright ©2016 Contoso Corporation</copyright>
<!-- Tags appear in the gallery and can be used for tag searches -->
<tags>web utility http json url parsing</tags>
<!-- Dependencies are automatically installed when the package is installed -->
<dependencies>
<dependency id="Newtonsoft.Json" version="9.0" />
</dependencies>
</metadata>
<!-- A readme.txt will be displayed when the package is installed -->
<files>
<file src="readme.txt" target="" />
</files>
</package>
命令:
nuget spec
nuget pack ClassLibrary2.csproj -Build -Properties Configuration=Release
nuget push *.nupkg -s http://127.0.0.1 apikey
Browser Request 的網址相關的屬性與用法:
| 網址:http://localhost:1897/News/Press/Content.aspx/123?id=1#toc | |
| Request.ApplicationPath | / |
| Request.PhysicalPath | D:\Projects\Solution\web\News\Press\Content.aspx |
| System.IO.Path.GetDirectoryName(Request.PhysicalPath) | D:\Projects\Solution\web\News\Press |
| Request.PhysicalApplicationPath | D:\Projects\Solution\web\ |
| System.IO.Path.GetFileName(Request.PhysicalPath) | Content.aspx |
| Request.CurrentExecutionFilePath | /News/Press/Content.aspx |
| Request.FilePath | /News/Press/Content.aspx |
| Request.Path | /News/Press/Content.aspx/123 |
| Request.RawUrl | /News/Press/Content.aspx/123?id=1 |
| Request.Url.AbsolutePath | /News/Press/Content.aspx/123 |
| Request.Url.AbsoluteUri | http://localhost:1897/News/Press/Content.aspx/123?id=1 |
| Request.Url.Scheme | http |
| Request.Url.Host | localhost |
| Request.Url.Port | 1897 |
| Request.Url.Authority | localhost:1897 |
| Request.Url.LocalPath | /News/Press/Content.aspx/123 |
| Request.PathInfo | /123 |
| Request.Url.PathAndQuery | /News/Press/Content.aspx/123?id=1 |
| Request.Url.Query | ?id=1 |
| Request.Url.Fragment | |
| Request.Url.Segments | / News/ Press/ Content.aspx/ 123 |
.
测试SQL注入的工具:通过精度选择还是向量覆盖率选择?
为了回答这个问题,我们使用了sectoolmarket.com网站提供的标准测试结果,我们先假设候选的扫描程序的测试精度和向量覆盖率有相同的重要
性。我们将GET。POST,HTTP Cookie和HTTP
Headers作为应该被支持的输入向量。当所有的参数都被支持时,这个扫描器的覆盖范围的比率为100%(4/4)。
我们建议使用下面的算术方程式,也就是说对于漏洞扫描器的得分求一个平均值。
然后从得到的检测准确率的百分比中,我们列出前14名的扫描器:
| Rank | Vulnerability Scanner | Vendor | Detection Rate | Input Vector Coverage | Average Score |
| 1 | Arachni | Tasos Laskos | 100.00% | 100% | 100.00% |
| 2 | Sqlmap | sqlmap developers | 97.06% | 100% | 98,53% |
| 3 | IBM AppScan | IBM Security Sys Division | 93.38% | 100% | 96,69% |
| 4 | Acunetix WVS | Acunetix | 89.71% | 100% | 94,85% |
| 5 | NTOSpider | NT OBJECTives | 85.29% | 100% | 92,64% |
| 6 | Nessus | Tenable Network Security | 82.35% | 100% | 91,17% |
| 7 | WebInspect | HP Apps Security Center | 75.74% | 100% | 87,87% |
| 8 | Burp Suite Pro | PortSwigger | 72.06% | 100% | 86,03% |
| 9 | Cenzic Pro | Cenzic | 63.24% | 100% | 81,62% |
| 10 | SkipFish | Michal Zalewski – Google | 50.74% | 100% | 75,37% |
| 11 | Wapiti | OWASP | 100.00% | 50% | 75.00% |
| 12 | Netsparker | Mavituna Security | 98.00% | 50% | 74.00% |
| 13 | Paros Pro | MileSCAN Technologies | 93.38% | 50% | 71,69% |
| 14 | ZAP | OWASP | 77,21% | 50% | 63,60% |
我们可以通过对扫描器的扫描漏洞的精度和向量覆盖率取到的平均值,做出下面一个图表。
下表来源:https://msdn.microsoft.com/en-us/library/ms161953%28SQL.105%29.aspx
When you can, reject input that contains the following characters.
|
Input character |
Meaning in Transact-SQL |
|---|---|
|
; |
Query delimiter. |
|
' |
Character data string delimiter. |
|
-- |
Comment delimiter. |
|
/* ... */ |
Comment delimiters. Text between /* and */ is not evaluated by the server. |
|
xp_ |
Used at the start of the name of catalog-extended stored procedures, such as xp_cmdshell. |
China unicom ping aws
位于北京-使用联通网络ping AWS 服务
2017/03/01
美国东部 (弗吉尼亚北部)
C:\Users\Administrator>ping console.aws.amazon.com
正在 Ping us-east-1.console.aws.amazon.com [54.239.31.83] 具有 32 字节的数据:
来自 54.239.31.83 的回复: 字节=32 时间=281ms TTL=224
来自 54.239.31.83 的回复: 字节=32 时间=281ms TTL=224
来自 54.239.31.83 的回复: 字节=32 时间=281ms TTL=224
来自 54.239.31.83 的回复: 字节=32 时间=281ms TTL=224
美国东部 (俄亥俄)
C:\Users\Administrator>ping us-east-2.console.aws.amazon.com
正在 Ping console.us-east-2.amazonaws.com [52.95.20.79] 具有 32 字节的数据:
来自 52.95.20.79 的回复: 字节=32 时间=219ms TTL=230
来自 52.95.20.79 的回复: 字节=32 时间=219ms TTL=230
来自 52.95.20.79 的回复: 字节=32 时间=223ms TTL=230
来自 52.95.20.79 的回复: 字节=32 时间=218ms TTL=230
美国西部 (加利福尼亚北部)
C:\Users\Administrator>ping us-west-1.console.aws.amazon.com
正在 Ping us-west-1.console.aws.amazon.com [176.32.112.45] 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
美国西部 (俄勒冈)
C:\Users\Administrator>ping us-west-2.console.aws.amazon.com
正在 Ping us-west-2.console.aws.amazon.com [54.240.254.239] 具有 32 字节的数据:
来自 54.240.254.239 的回复: 字节=32 时间=236ms TTL=233
来自 54.240.254.239 的回复: 字节=32 时间=237ms TTL=233
来自 54.240.254.239 的回复: 字节=32 时间=235ms TTL=233
来自 54.240.254.239 的回复: 字节=32 时间=236ms TTL=233
加拿大 (中部)
C:\Users\Administrator>ping ca-central-1.console.aws.amazon.com
正在 Ping console.ca-central-1.amazonaws.com [52.94.96.127] 具有 32 字节的数据:
来自 52.94.96.127 的回复: 字节=32 时间=242ms TTL=229
来自 52.94.96.127 的回复: 字节=32 时间=238ms TTL=229
来自 52.94.96.127 的回复: 字节=32 时间=238ms TTL=229
来自 52.94.96.127 的回复: 字节=32 时间=237ms TTL=229
欧洲 (爱尔兰)
C:\Users\Administrator>ping eu-west-1.console.aws.amazon.com
正在 Ping eu-west-1.console.aws.amazon.com [54.239.38.117] 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
欧洲 (法兰克福)
C:\Users\Administrator>ping eu-central-1.console.aws.amazon.com
正在 Ping console.eu-central-1.amazonaws.com [54.239.54.102] 具有 32 字节的数据:
来自 54.239.54.102 的回复: 字节=32 时间=413ms TTL=234
来自 54.239.54.102 的回复: 字节=32 时间=412ms TTL=234
来自 54.239.54.102 的回复: 字节=32 时间=413ms TTL=234
来自 54.239.54.102 的回复: 字节=32 时间=413ms TTL=234
欧洲 (伦敦)
C:\Users\Administrator>ping eu-west-2.console.aws.amazon.com
正在 Ping console.eu-west-2.amazonaws.com [52.94.56.93] 具有 32 字节的数据:
来自 52.94.56.93 的回复: 字节=32 时间=363ms TTL=234
来自 52.94.56.93 的回复: 字节=32 时间=354ms TTL=234
来自 52.94.56.93 的回复: 字节=32 时间=359ms TTL=234
来自 52.94.56.93 的回复: 字节=32 时间=366ms TTL=234
亚太区域 (新加坡)
C:\Users\Administrator>ping ap-southeast-1.console.aws.amazon.com
正在 Ping ap-southeast-1.console.aws.amazon.com [54.240.226.142] 具有 32 字节的
数据:
来自 54.240.226.142 的回复: 字节=32 时间=146ms TTL=238
来自 54.240.226.142 的回复: 字节=32 时间=146ms TTL=238
来自 54.240.226.142 的回复: 字节=32 时间=148ms TTL=238
来自 54.240.226.142 的回复: 字节=32 时间=146ms TTL=238
亚太区域 (悉尼)
C:\Users\Administrator>ping ap-southeast-2.console.aws.amazon.com
正在 Ping ap-southeast-2.console.aws.amazon.com [54.240.195.68] 具有 32 字节的数
据:
来自 54.240.195.68 的回复: 字节=32 时间=231ms TTL=237
请求超时。
来自 54.240.195.68 的回复: 字节=32 时间=233ms TTL=237
来自 54.240.195.68 的回复: 字节=32 时间=231ms TTL=237
亚太区域 (首尔)
C:\Users\Administrator>ping ap-northeast-2.console.aws.amazon.com
正在 Ping ap-northeast-2.console.aws.amazon.com [52.95.193.28] 具有 32 字节的数
据:
来自 52.95.193.28 的回复: 字节=32 时间=138ms TTL=236
来自 52.95.193.28 的回复: 字节=32 时间=135ms TTL=236
来自 52.95.193.28 的回复: 字节=32 时间=142ms TTL=236
来自 52.95.193.28 的回复: 字节=32 时间=138ms TTL=236
亚太区域 (东京)
C:\Users\Administrator>ping ap-northeast-1.console.aws.amazon.com
正在 Ping ap-northeast-1.console.aws.amazon.com [54.239.96.82] 具有 32 字节的数
据:
来自 54.239.96.82 的回复: 字节=32 时间=89ms TTL=235
来自 54.239.96.82 的回复: 字节=32 时间=88ms TTL=235
来自 54.239.96.82 的回复: 字节=32 时间=89ms TTL=235
来自 54.239.96.82 的回复: 字节=32 时间=91ms TTL=235
亚太区域 (孟买)
C:\Users\Administrator>ping ap-south-1.console.aws.amazon.com
正在 Ping console.ap-south-1.amazonaws.com [52.95.88.43] 具有 32 字节的数据:
请求超时。
来自 52.95.88.43 的回复: 字节=32 时间=336ms TTL=229
来自 52.95.88.43 的回复: 字节=32 时间=336ms TTL=229
来自 52.95.88.43 的回复: 字节=32 时间=336ms TTL=229
南美洲 (圣保罗)
C:\Users\Administrator>ping sa-east-1.console.aws.amazon.com
正在 Ping sa-east-1.console.aws.amazon.com [177.72.244.68] 具有 32 字节的数据:
请求超时。
来自 177.72.244.68 的回复: 字节=32 时间=487ms TTL=239
请求超时。
来自 177.72.244.68 的回复: 字节=32 时间=499ms TTL=239
BAT 1:
| @echo off
echo 美国东部 (弗吉尼亚北部) echo 美国东部 (俄亥俄) echo 美国西部 (加利福尼亚北部) echo 美国西部 (俄勒冈) echo 加拿大 (中部) echo 欧洲 (爱尔兰) echo 欧洲 (法兰克福) echo 欧洲 (伦敦) echo 亚太区域 (新加坡) echo 亚太区域 (悉尼) echo 亚太区域 (首尔) echo 亚太区域 (东京) echo 亚太区域 (孟买) echo 南美洲 (圣保罗) pause |
BAT 2:
| @echo off
ping console.aws.amazon.com ping us-east-2.console.aws.amazon.com ping us-west-1.console.aws.amazon.com ping us-west-2.console.aws.amazon.com ping ca-central-1.console.aws.amazon.com ping eu-west-1.console.aws.amazon.com ping eu-central-1.console.aws.amazon.com ping eu-west-2.console.aws.amazon.com ping ap-southeast-1.console.aws.amazon.com ping ap-southeast-2.console.aws.amazon.com ping ap-northeast-2.console.aws.amazon.com ping ap-northeast-1.console.aws.amazon.com ping ap-south-1.console.aws.amazon.com ping sa-east-1.console.aws.amazon.com pause |
Int64.Max 9223372036854775807
UInt64.Max 18446744073709551615
每分钟1亿条:
100000000 * 60 * 24
day =144000000000
9223372036854775807 / 144000000000 / 365
year = 175482
每分钟10亿条:
1000000000 * 60 * 24
day =1440000000000
9223372036854775807 / 1440000000000 / 365
year = 17548
每分钟100亿条:
10000000000 * 60 * 24
day =14400000000000
9223372036854775807 / 14400000000000 / 365
year = 1754
采用基于数据挖掘的算法来实现推荐引擎是各大电子商务网站、SNS社区最为常用的方
法,推荐引擎常用的Content-Based推荐算法及协同过滤算法(Item-Based
、User-based)在电子商务推荐系统入门v2.0 、电子商务推荐系统入门基础 中已经有所阐述。但从实际应用来看,对于大部分中小型企业来说,
要在电子商务系统完整采用以上算法有很大的难度。
1)、相对成熟、完整、现成的开源解决方案较少
粗略分来,目前与数据挖掘及推荐引擎相关的开源项目主要有如下几类:
数据挖掘相关:主要包括Weka、R-Project、Knime、RapidMiner、Orange 等
文本挖掘相关:主要包括OpenNLP、LingPipe、FreeLing、GATE 、Carrot2 等,具体可以参考LingPipe’s Competition
推荐引擎相关:主要包括Apache Mahout、Duine framework、Singular Value Decomposition (SVD) ,其他包可以参考Open Source Collaborative Filtering Written in Java
搜索引擎相关:Lucene、Solr、Sphinx、Hibernate Search等
2)、常用推荐引擎算法相对复杂,入门门槛较低
3)、常用推荐引擎算法性能较低,并不适合海量数据挖掘
以上这些包或算法,除了Lucene/Sor相对成熟外,大部分都还处于学术研究使用,并不能直接应用于互联网大规模的数据挖掘及推荐引擎引擎使用。
对很多众多的中小型网站而言,由于开发能力有限,如果有能够集成了搜索、推荐一体化的解决方案,这样的方案肯定大受欢迎。采用Lucene来实现推荐引擎具有如下优势:
1)、Lucene 入门门槛较低,大部分网站的站内搜索都采用了Lucene
2)、相对于协同过滤算法,Lucene性能较高
3)、Lucene对Text Mining、相似度计算等相关算法有很多现成方案
在开源的项目中,Mahout或者Duine Framework用于推荐引擎是相对完整的方案,尤其是Mahout
核心利用了Lucene,因此其架构很值得借鉴。只不过Mahout目前功能还不是很完整,直接用其实现电子商务网站的推荐引擎尚不是很成熟。只不过从
Mahout实现可以看出采用Lucene实现推荐引擎是一种可行方案。
Lucene擅长Text Mining较为擅长,Lucene在contrib包中提供了MoreLikeThis功能,可以较为容易实现Content-Based的推荐,但对于涉及用户协同过滤行为的结果(所谓的Relevance Feedback),Lucene目前并没有好的解决方案。需要在Lucene中内容相似算法中加入用户协同过滤行为对因素,将用户协同过滤行为结果转化为Lucene所支持的模型。
电子商务网站与推荐引擎相关典型的行为:
因此基于Lucene实现推荐引擎主要要处理如下两大类的数据
1)、内容相似度
例如:商品名称、作者/译者/制造商、商品类别、简介、评论、用户标签、系统标签
2)、用户协同行为相似度
例如:打标签、购买商品、点击流、搜索、推荐、收藏、打分、写评论、问答、页面停留时间、所在群组等等
基于Lucene MoreLikeThis实现即可。
1)、用户每一次协同行为都使用lucene来进行索引,每次行为一条记录
2)、索引记录中包含如下重要信息:
商品名、商品id、商品类别、商品简介、标签等重要特征值、用户关联行为的其他商品的特征元素、商品缩略图地址、协同行为类型(购买、点击、收藏、评分等)、Boost值(各协同行为在setBoost时候的权重值)
3)、对评分、收藏、点击等协同行为以商品特征值(标签、标题、概要信息)来表征
4)、不同的协同行为类型(例如购买、评分、点击)设置不同的值setBoost
5)、搜索时候采用Lucene MoreLikeThis算法,将用户协同转化为内容相似度
以上方案只是基于Lucene来实现推荐引擎最为简单的实现方案,方案的准确度及细化方案以后再细说。
更为精细的实现,可以参考Mahout的算法实现来优化。
更为精细的实现,可以参考Mahout的算法实现来优化。
Contents
存储是云计算的基石。 — Jack Ma
分布式存储有出色的性能,可以扛很多故障,能够轻松扩展,所以我们UnitedStack使用Ceph构建了高性能、高可靠的块存储系统,并使用它支撑UnitedStack公有云和托管云的云主机、云硬盘服务。
由于使用分布式块存储系统,避免了复制镜像的过程,所以云主机的创建时间可以缩短到10秒以内,而且云主机还能快速热迁移,方便了运维人员对物理服务器上硬件和软件的维护。
用户对于块存储系统最直观的感受来源于云硬盘服务,现在我们的云硬盘的特点是:
经过多轮的选型和测试,并踩过无数的坑之后,我们选择了合适我们的软件和硬件。
软件
硬件
随着软硬件的升级,需求的调整, 我们的部署架构也不断在演进,力求在成本、性能、可靠性上达到最佳平衡点。
最小规模部署中有12个节点,每个节点上有3块SSD。节点上有2个万兆口和1个千兆口,虚拟机网络和存储网络使用万兆口,管理网络使用千兆口。每个集群中都有3个Ceph Monitor节点。
云计算的好处是极强的扩展性,作为云计算的底层架构,也需要有快速的Scale-out能力。在块存储系统的部署架构中,可以以12台节点为单位进行扩展。
原生的OpenStack并不支持统一存储,云主机服务Nova、镜像服务Glance、云硬盘服务Cinder的后端存储各不相同,造成了严重的内耗。我们把这三大服务的后端统一起来,进行高效管理,解决了虚拟机创建时间长和镜像风暴等问题,还能让虚拟机随便漂移。
原生的OpenStack
改造后的OpenStack
使用原生的OpenStack创建虚拟机需要1~3分钟,而使用改造后的OpenStack仅需要不到10秒钟时间。这是因为nova-compute不再需要通过HTTP下载整个镜像,虚拟机可以通过直接读取Ceph中的镜像数据进行启动。
我们还增加两个OpenStack没有的功能: QoS 和 共享云硬盘。云计算的另外一个好处是租户资源隔离,所以必备QoS。共享云硬盘可以挂载给多台云主机,适用于数据处理的场景。
我们还使用了OpenStack的multi-backend功能,支持多种云硬盘类型,现在我们的云硬盘类型有性能型、容量型,可以满足数据库和大文件应用。
存储系统主要的性能指标是IOPS和Latency。我们对于IOPS的优化已经达到了硬件的瓶颈,除非更换更快的固态硬盘或者闪存卡,或者是改变整个架构。我们对于Latency的优化也快接近完成,可以达到企业级存储的水平。
整个块存储系统有着长长的I/O栈,每个I/O请求要穿过很多线程和队列。
优化操作系统的参数可以充分利用硬件的性能。
Qemu作为块存储系统的直接消费者,也有很多值得优化的地方。
我们对于Ceph的优化是重头戏,有很多问题也是时间长、规模上去之后才暴露出来的。
存储需要高可靠性,保证数据可用并且数据不丢失。因为我们的架构中没有使用UPS和NVRAM,所以写请求的数据都是落到三块硬盘之后才返回,这样UnitedStack最大限度地保证了用户的数据安全。
持久性是数据丢失的概率,可以用于度量一个存储系统的可靠性,俗称
“多少个9”。数据的放置(DataPlacement)决定了数据持久性,而Ceph的CRUSH MAP又决定了数据的放置,因此CRUSH
MAP的设置决定了数据持久性。但是,即时我们知道需要修改CRUSH MAP的设置,但是我们应该怎么修改CRUSH
MAP的设置呢,我们该如何计算数据持久性呢?
我们需要一个计算模型和计算公式,通过以下资料,我们可以构建一个计算模型和计算公式。
最终的计算公式是: P = func(N, R, S, AFR)
这个计算模型是怎么样得到计算公式的呢?下面是4个步骤。
硬盘发生故障的概率是符合泊松分布的:
Ceph的每个PG是有R份副本的,存放在R个OSD上,当存有这个PG的R个OSD都发生故障时,数据是不可访问的,当这R个OSD都损坏时,数据是不可恢复的。
计算一年内任意R个OSD发生相关故障概率的方法是:
因为这任意R个OSD不一定存有同一个PG的副本,所以这任意R个OSD发生故障并不会导致数据不可恢复,也就是不一定会导致数据丢失。
假设每个PG对应一组OSD(有R个OSD, 称之为Copy Set),有可能多个PG对应同一组OSD。假设有M个不同的Copy Set, M是一个非常重要的数字。
我们再来对Copy Set进行精确的定义:Copy Set上至少有一个PG的所有副本,当这个Copy
Set损坏时,这个PG的所有副本也会丢失,这个PG上的所有数据就不可恢复。所以Ceph丢失数据的事件就是Ceph丢失PG,
Ceph丢失PG就是有一个Copy Set发生损坏,一个Copy Set丢失的概率就是 P = Pr * M / C(R, N) 。
持久性公式就是个量化工具,它可以指明努力的方向。我们先小试牛刀,算一下默认情况下的持久性是多少?
假设我们有3个机架,每个机架上有8台节点,每个几点上有3块硬盘,每个硬盘做一个OSD,则一共有72个OSD。
默认的crush map设置如下所示
通过持久性公式,我们得到下面的数据。
默认情况下,持久性有8个9,已经比一般的RAID5、RAID10要高,和RAID6差不多,但是还不能满足公有云的要求,因为公有云的规模很大,故障事件的数学期望也会很大,这就逼着我们尽量提高持久性。
提高持久性的方法有很多,比如增加副本数,使用Erase Code等。不过这些方法都有弊端,增加副本数势必会扩大成本;使用Erase Code会导致Latency提高,不适合于块存储服务。在成本和Latency的制约下,还有什么办法可以提高持久性呢?
前面我们已经得到一个量化公式 P = Pr * M / C(R, N), 我们从量化公式入手,去提高持久性(也就是降低P)。要想降低P, 就得降低Pr、M,或者是提高C(R, N)。因为C(R, N)已经确定,我们只能降低Pr和M。
从Pr的定义可以知道Pr与恢复时间有关,恢复时间越短,Pr的值越低。那么恢复时间跟什么有关系呢?
我们需要增加更多的OSD用于数据恢复,以便减少恢复时间。目前host
bucket不能增加更多的OSD,这是因为主机的网络带宽限制和硬盘插槽限制。解决办法是从CRUSH MAP入手,增加一种虚拟的Bucket:
osd-domain, 不再使用host bucket。
通过使用osd-domain bucket,我们把持久性提高了10倍,现在持久性有9个9。
如何减少Copy Set的个数呢?Copy Sets是和PG的映射有关的,我们从CRUSH
MAP的规则和条件入手,减少Copy Set的个数。解决办法增加虚拟的Bucket: replica-domain, 不再使用rack
bucket。每个PG必须在一个replica-domain上,PG不能跨replica-domain,这样可以显著减少Copy Set的个数。
通过使用replica-domain,现在的持久性有10个9,持久性比默认的crush map设置提高了100倍。
Ceph的运维比较费心,稍有差池,整个云平台都会受到影响,因此我们觉得运维的目标是可用性:
减少不必要的数据迁移,进而减少slow requests,保证SLA。
我们整个UnitedStack云平台都是使用Puppet部署的,因此我们使用了Puppet去部署Ceph。一般Ceph的安装是分阶段的:
Puppet只需要完成前三步,第四步一般根据具体情况用脚本去执行。因为OSD ID是在执行过程中得到的,而Puppet是编译后执行,这是一个悲伤的故事,所以puppet-ceph模块必须设计成retry的。
相比eNovance和Stackforge的puppet-ceph模块,我们的puppet-ceph模块的优点是:
在升级Ceph、替换硬盘、重启机器、扩展集群的准则是:
Ceph自家的Calamari长得不错,但是不够实用,而且它的部署、打包还不完善,在CentOS上还有一些BUG,我们只能继续使用原有的工具。
我们根据Ceph软件架构对每个OSD分成了很多个throttle层,下面是throttle模型:
有了throttle model,我们可以对每个throttle进行监控,我们在diamond上增加了新的collector用于对这些throttle进行监控,并重新定义了metric name。
最后,我们可以得到每个OSD每层throttle的监控数据。但平时只会关注IOPS、吞吐率、OSD Journal延迟、读请求延迟、容量使用率等。
在云平台上线已经快一年了,我们遇到的大小事故有:
总体来说,Ceph是非常稳定和可靠的。
UnitedStack未来的工作会集中于