Archive for 六月, 2013

cache类

需求:
1. 能够根据不同的规则,hash缓存项。以便异常情况下,做完全的物理隔离。
2. 每个cache group,非单点
3. 增加cache group,不会造成雪崩效应
存储内容:
1. session,不允许flush,与在线用户量相关
2. appinfo等配置信息,不允许flush,热点数据(每个request都需要访问),与uclogin功能发展、挂接产品线数量相关,基本保持线性增长
3. acct等用户信息,允许flush,与活跃用户量相关

 

监控与系统参数:
1. 各group cache 内存使用占比、命中率、读写次数

 

memcached与memcached 区别:
http://hily.me/blog/2010/05/php-memcache-vs-memcached/
http://hi.baidu.com/tony_wd/item/605e959241f87c8c59146164
key的hash算法:
http://tech.idv2.com/2008/07/24/memcached-004/
https://www.surfchen.org/archives/348
http://www.php.net/manual/zh/memcache.addserver.php
memcache扩展的add_server方法,是lazy connect的。故添加多个memcached实例,并不会带来额外的开销(存储配置信息不计)。
但get/set时,memcache会利用memcache.hash_strategy和memcache.hash_function配置做hash,选择某一个实例使用。
这就涉及到,这两个参数的配置,据传consistent+crc32在增加cache实例时,在命中率方面有较好的表现。
即使用addserver方法,相当于把cache分组的工作交给memcache扩展来做了。
但是这样,我们没法知道一个key具体落在哪个分组上。
我们当前的cache方式为:
master:多node,addserver
slave:多node,addserver
写时,写master+slave,都成功才算成功
读时,先读master,若失败再读slave

做小修改:
group1:多node,addserver
group2:多node,addserver
写时,写group1+group2,返回两者的写结果,调用者可根据一致性强度,自行决定是否成功
读时,随机选择一个group,若失败再读下一个group
==========memcached替换memcache================
且使用memcached extension替换memcache,以支持更多的memcached协议,例如mutilget等。
Memcached::addServer()增加指定服务器到服务器池中。此时不会建立与服务端的连接, 但是,如果你使用一致性key分布选项(Memcached::DISTRIBUTION_CONSISTENT或 Memcached::OPT_LIBKETAMA_COMPATIBLE),一些内部的数据结构将会被更新。 因此,如果你需要增加多台服务器,更好的方式是使用 Memcached::addServers() 以确保这种更新只发生一次。

Memcached::addByKey — 在指定服务器上的一个新的key下增加一个元素。可利用该类方法,对数据所属的server进行分组。例如,要将某用户的session信息与userinfo信息 cache到同一组memcached上,则可以指定相同的server_key。
memcached还引入了乐观锁的概念,来保证强一致性。
CAS(Check and Set)协议解决这种并发修改问题。有线程试图修改当前key-value对的value时,先由gets方法得到item的版本号,操作完成提交数据时,使用cas方法谨慎变更,如果在本地对item操作过程中这个key-value对在Memcached server端被其它线程更改过,就放弃此次修改(乐观锁概念)。

可以利用getResultCode()来获取上一次操作的code码:http://www.php.net/manual/zh/memcached.getresultcode.php,getResultMessage 获取描述信息。

背景

原理

https端口proxy

crt chain 配置

最近觉得进步较慢,而且思维没有以前快速和集中。突然想起之前myspace时,一度也有过这种状态,当时大夫的建议是,不管多忙,要抽点时间出来充电,且给了google reader的建议。虽然现在reader即将关闭,但习惯还可以继续。

目前身处的公司,可谓金矿,大把的代码、文档、优秀同事,如果若干年离开时,除了手头的项目,再无其他积累,岂不可惜?!

从现在开始,在此记录,每天早上留半个小时给自己。可以是技术、流程、工具、管理、为人处世,等等,每天学习一个新东西,并形成心得文字。若进展顺利,则推行到team里。

————————————

今天的新知识,是在路上的思考。关于面试。

还牢记着当年晓生和大夫的建议。面试,是为了找出对方的优点,而非证明自己比对方强。若不了解面试者的经历,则多方面询问,从整体和细节查看是否真实、面试者是否真正掌握。也可以拿自己工作中遇到的问题,询问对方,共同探讨。

目前作为一面或二面,我主要想考察的是:

  1. 基本的编程能力,包括语言熟练程度、代码风格、边界条件的考虑,编程习惯即先设计后动手,还是先动手再优化
  2. 逻辑思维能力,通过算法或者逻辑推理题考量
  3. 常用工具,如linux、mysql、apache/nginx、文本处理
  4. 业务架构能力,如设计一些常见系统
  5. 系统与代码架构能力,若工作较久可以则考量系统架构,否则讨论些设计模式
  6. 性能调优能力,怎样发现瓶颈、怎样优化,实践经验
  7. 团队合作与性格

而作为面试官,作为未来的负责人或者同事,我的心态应如何?一方面,面试时,希望挑到性格合拍的同事,另一方面,包容心。

面对经验较少、技术稍逊于自己的同事,讨论出一两年内适合他的发展路线,包括技术的、个性发展的,在公司和个人内帮忙他找到平衡。

面对相当的同事,我需要有平和的心态,不要总想比个高下。找到各自的长短处,如果互补当然最好,各自强化长度,并弥补短处。否则可以共同进步。

面对更强的同事,维持学习的心态,尽自己所能帮助他快速融入,并学习他的长处。

总而言之,从团队和对方的角度出发,忘记自己,这也是修炼。

 

最近在一个较大规模的项目里,需要引入nginx作为反向代理层。为了防止可用文件描述符成为瓶颈,需要先对系统整体情况做一个把握。由于linux将普通文件、socket、pipe等都看作文件,故这里的限制是对系统内的各种类型文件的限制。

操作系统对fd的限制

单进程限制

通过ulimit -n 能看到当前用户每个进程允许打开的文件描述符个数。

通过ulimit -n [limitnum] 可以改变可用描述符个数。如果操作失败,则可能是因为系统配置文件里,对资源做了限制,在/etc/security/limits.conf查看有没有针对指定用户或所有用户的设置。修改或添加,并重新登录系统即可生效。

系统整体限制

cat /proc/sys/fs/file-max 可以看到这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)的文件个数,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。

cat /proc/sys/fs/file-nr 可以看到文件描述符现状,3列数字分别是: the number of allocated file handles, the number of allocated but unused file handles, and the maximum number of file handles。

这里可以看到,系统进程间也是有描述符竞争关系的。

 

另外,由于操作系统有fd取值范围,若没有可用值了,也会导致tcp连接失败。

通过sysctl -a | grep net.ipv4.ip_local_port_range可以看到fd取值范围。修改/etc/sysctl.conf并执行sysctl -p,可修改该范围:

加入:net.ipv4.ip_local_port_range = 1024 65000。

 

另外,iptable的ip_conntrack_max也可以会有影响,修改方法类似ip_local_port_range。

硬件对fd的限制

todo

nginx对fd的限制

nginx core_module有worker_rlimit_nofile,也是对单进程可用描述符的限制,不可以超过系统ulimit -n的值。

—————————————————————————————-

/etc/security/limits.conf 限制

如果你碰到类似的错误提示
ulimit: max user processes: cannot modify limit: 不允许的操作
ulimit: open files: cannot modify limit: 不允许的操作

为啥root用户是可以的?普通用户又会遇到这样的问题?
看一下/etc/security/limits.conf大概就会明白。
linux对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限。
超出上限的修改就会出“不允许的操作”这样的错误。

在limits.conf加上
*        soft    noproc  10240
*        hard    noproc  10240
*        soft    nofile  10240
*        hard    nofile  10240
就是限制了任意用户的最大线程数和文件数为10240。退出后重新登录就可以了。

—————————————————————————————-