[科学院手记]人人网新鲜事分享现场转播

讲座已经开始,现在是人人网牛人张洁介绍。

----

现在是新鲜事后台架构牛人铁安在讲解新鲜事要完成的功能:

将一个用户产生的内容实时发送给与他相关的一群人。

尽可能地帮助用户保存内容。

现在面临的挑战

分发压力:5000W*100 全天分发的总量在五十亿左右。每秒分发的次数是六万次每秒。

现在有1.3t的内存占用。

----

老版本的新鲜事结构

----

新的系统结构

分发之后,内容本体丢进cache和db,dispatch服务通知到相关的人,分发后来的结构保存一人一条到TC

---

MENU

技术细节部分

分发部分的策略优化:瞬间分发海量数据,光良首页的例子(一百万的粉丝同时产生)。产品策略优化。

内存压缩技术:新鲜事内存结构(FlyWeight),字符串压缩存储(QuickLZ)

新鲜事存储方案

----

内存压缩技术:flyweight的设计思想

只要对象存在,所有的指针都能找到正确的内容。

boost::flyweight在高并发情况下有效率问题,自己实现了相同的功能。

各种压缩办法的性能比较:

QuickLZ的压缩比不是最高的,但解压缩是最快的;代码简单;支持追加方式的压缩;有成熟的商业应用。

boost::multi_index介绍 用来做多视图显示的东东 提供三种不同的索引方式

一段例子代码 c++代码。。。略鸟

-------

新鲜事存储方案

TC+Direct IO + SSD

key-value DB的一个表。

研究的三个开源项目:

Hypertable

tokyo tyrant

MemcacheDB (哈哈,测试了两个张宴兄弟的东东,感叹一下下,张宴兄弟在nginx和tt的文档贡献真是不浅)

TC的测试结果

读取很少的数据的情况下读和写都很快,在几个G之内的数据文件,数据量增加到一定程度写入会持续下降。100G一秒只能写入六七百次。所以单纯使用TC是不现实的。

新的方案

所有的写合并;通过LOG保证Down机后数据恢复;使用TC保存索引;使用异步IO读写文件;使用DirectIO屏蔽OS的Cache策略;使用SSD解决大量的并发读取。

SSD随机读和顺序读速度接近。五六万每次的速度。

-------

全场结束,答疑

-------

当幸福来敲门

我们都一样
一样的善良
一样为需要的人打造一个天堂
歌声是翅膀
唱出了希望
所有的付出只因爱的力量
和你一样
我们都一样
谁在最需要的时候轻轻拍着我肩膀
谁在最快乐的时候愿意和我分享
日子那么长
我在你身旁
见证你成长
永远为你鼓掌

因为失去过,所以才懂得珍惜,因为失去过,所以才怕再次失去,因为失去过,所以才懂得享受幸福。

当幸福来敲门

史密斯先生随手提的笨重的仪器,具有压垮脆弱人生巨大的负荷,压抑的感觉充满心灵,持续不断。

当幸福来敲门的时候

最后喘出的气息,天高云淡的感觉,豁然开朗,理解幸福与快乐,学会幸福与快乐。

一月之后,是新的一年,心情超好,呼,好久没有喘气的感觉。

一周废话汇总【54chen Twitter 2009-11-28】

  • 支付宝不支持ubuntu firefox3.55? #
  • 前台看到一个应聘java的,居然是老妈带来在前台帮着登记 #
  • 转文章故意去掉出处的小人,我代表中国一线的原创作者BS你。 #
  • http://page.renren.com/600002662?ref=54chen offer寺,找工作专用,拜过有offer #
  • 一个人的成长有两个条件,一是要给予足够的时间,没有任何人会在一天之内成长起来,就像一棵树一样,十年过去才会发现长大了,另一个条件是生命的热情永不熄灭,不管多么卑微,内心的种子一定要向往天空,要尽力伸展自己的枝叶去触摸蓝天,去追逐天空的云彩,有了向上的心,一定就会有灿烂的果。 #
  • google wave每人放出了8个 #
  • 席慕容说过:我并不是立意要错过 可是我 一直都在这样做 。生命的旅驿中 一定有些什么,是使你我不可割舍的;一定有些什么,是令你我思念牵挂的;一定有些什么,是让你我柔肠千转刻骨铭心的。如果昨日重现,请别再让幸福擦肩。 #
  • 至尊宝挖开自己的心,看到了紫霞留在那里的一滴眼泪,毕竟曾经沧海过。五百年又五百年,兜了一个大圈子又回到了原地。人没能战胜命运,而人的尊严却在抗争中得到了肯定,人的情感也必将不朽。 #
  • 1949年,只有社会主义才能救中国; 1979年,只有资本主义才能救中国; 1989年,只有中国才能救社会主义; 2009年,只有中国才能救资本主义; 2012年,只有中国才能救地球…… #
  • 好疯狂 到处是google wave的邀请 全是用户自发的 这是如何做到的 #

ubuntu9.10里的firefox不显示DNS Flusher插件的解决办法

ubuntu 9.10里的firefox是3.55版本的,DNS Flusher是个很好用的快速切换dns的插件。

ubuntu下是大小写敏感的,而DNS Flusher的作者似乎只是个windows用户。

修改这个文件:

vim /home/cc/.mozilla/firefox/icj6nr4a.default/extensions/{7d575baa-b543-11dc-8314-0800200c9a66}/chrome.manifest (根据你的情况自己修改下目录)

然后修改这个文件里的第一行和第二行里的两个overlay,将里面的dnsFlusher.xul都改成dnsflusher.xul,注意,只修改前面两个overlay,后面的content和skin无需修改。

一周废话汇总【54chen Twitter 2009-11-21】

  • 网友就网络防火墙和TWITTER提问奥巴马。奥巴马称“一直坚定支持互联网开放使用,非常支持不审查内容”。 #
  • 转自雷铮♥Fish: 我拿着一麻袋钱去上大学,换来了一麻袋书,毕业了,用这些书去换钱,却买不起一个麻袋! #
  • x200 ntfs硬盘安装ubuntu9.10正式版手记,正式版还是不错的。。。 http://www.54chen.com/c/830 #
  • 焊雷管、锯灯泡、修理火车内外胎 http://www.54chen.com #
  • 两个人时,善待对方,一个人时,善待自己。有过失恋的苦涩,也许会让下次的爱情多些理性的等待和成熟的耕耘与浇灌,有过失恋的痛苦,也许会对爱情的珍视会真正的从内心深处生发出来。 #

Ubuntu 9.10下linuxqq经常挂掉的解决方案

ubuntu 9.10下linuxqq(官方的QQ,八百年不更新的那个了)

sudo vim /usr/bin/qq
增加
#!/bin/sh

export GDK_NATIVE_WINDOWS=true

cd /usr/share/tencent/qq/

./qq 经试验正确无误。。。linuxqq不再挂。。。五四陈科学院小道报道

Ubuntu 9.10安装配置eclipse、subclipse、m2eclipse(svn插件和maven插件)

ntfs硬盘安装ubuntu 9.10方案见: x200 ntfs硬盘安装ubuntu9.10正式版手记 eclispe 3.51安装:

sudo apt-get install eclipse
整完会在应用程序中多出来一项“编程”。

此时的eclipse是以自带的jre来运行的,后面的maven插件会要求eclipse在jdk里运行,而不是jre里,所以再安装一下jdk:

sudo apt-get install sun-java6-jdk
这样,jdk会安装到/usr/lib/jvm/java-6-sun

然后修改eclipse.ini

sudo vim /usr/lib/eclipse/eclipse.ini
在-vmargs上一行加入:
-vm
/usr/lib/jvm/java-6-sun-1.6.0.15/bin

(有回车) 同时选择一下window->preferences->java->installed jres增加对应目录的jre

然后开始 Help->install new software

subclipse http://subclipse.tigris.org/update_1.2.x

安装好subclipse。subclipse提供了svn的支持。

然后同样安装m2eclipse插件:

m2eclipse比较麻烦,需要依次安装的有:

emf http://download.eclipse.org/modeling/emf/updates/releases/

cdt http://download.eclipse.org/tools/cdt/releases/new

wtp http://download.eclipse.org/webtools/updates

ajdt http://download.eclipse.org/tools/ajdt/34/update

zest or GEF http://download.eclipse.org/tools/gef/updates/releases/

mylyn http://download.eclipse.org/tools/mylyn/update/e3.4 最后才是m2eclipse:

http://m2eclipse.sonatype.org/update/
注意,在安装过程中,有些update的url里有不止一个版本的选项,注意适当选取。

X200 ntfs硬盘安装ubuntu9.10正式版手记

09年10月31日,9.10发布了正式版本,科学院曾经出过两篇硬盘安装的手记,一个是8的一个是9.10测试版本的。地址是: [十一归来]ubuntu 9.10 硬盘安装手记 ubuntu 8.10 desktop版本 硬盘安装手记

先说平时我们用wingrub安装的时候,是不支持ntfs的,只能用grub for dos的grldr文件(grub4dos的这个文件支持ntfs)。

下载iso文件:ubuntu-9.10-desktop-i386.iso

同上一文,我列出使用的boot.ini和menu.lst:

boot.ini

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
C:\GRLDR="wingrub"
menu.lst
timeout 10

title Windows at (hd0,0)
root (hd0,0)
chainloader +1

title install Ubuntu9.10
root (hd0,0)
kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-9.10-desktop-i386.iso ro quiet splash –
label check live-install
initrd (hd0,0)/initrd.lz 然后,iso文件放在D盘,用RAR打开iso文件,解压出来initrd.lz和vmlinuz两个文件。

重启电脑,进入desktop,双击安装。

最后的时候运行一下umount -l /isodevice

安装结束后,重启进系统,中文不全,选择一下最快的源,联网下语言包。

thinpad x200 所有硬件全部正常可使用。

一周废话汇总【54chen Twitter 2009-11-14】

  • 流感开始了,大批的兄弟倒下 #
  • 我从知道有爱情这么回事以来,樱木没和晴子好,宜静没有嫁大雄,新一也没有娶小兰,就连Li lei和Han meimei到现在也没结果...不能因为寂寞而苟且,不能因为孤独而恋爱 #
  • 露肩不拼医生吼啊~该触手时就触手啊~疯疯祸祸床就皱啊~ #
  • 上一推想歪的,一定是光棍,哦哈哈 #
  • QQ2.7W 群中Lokoo:你公司5人,你老板赚100W,你实习的,没薪水,
    那你的平均收入中50W了? 能这样算吗 #
  • @long132 万能的人工智能 #
  • 太白金星:娘娘为何闷闷不乐呢?王母娘娘:哎,最近发现玉帝老是心不在焉,时不时的往人间看。后来我才知道原来是在看美女。太白金星:是呀,不光玉帝,很多神仙也在偷看,只怪人间的女子衣服穿的越来越少,裙子越来越短。王母娘娘:那就降大雪冻冻他们吧。太白金星:好,臣这就去办。 #

人人网内部培训:java并发编程原理-synchronize Volatile-张洁大侠

来自人人网内部培训的最新消息:

北京时间今天下午不明时间,一群人在张洁大侠的培训下,对java并发编程原理-synchronize volatile等进行了激励的讨论和学习。出席本次会议的有。。。

言归正传,说,并发,就会出现锁。

1.互斥锁实现算法

使用一个并发队列:

do{

pre=head;

newNode->next=prev;

}while(!cas(head,prev,newNode)); 此代码中cas是操作系统提供的compare and swap接口,能保证原子性操作(类似memcache的cas)。

2.编译器指令优化使内存指令重排序与并发编程

并发的程序会受到指令重排序的影响,顺序执行的程序逻辑不会受影响。

例子:

int a=b=0;

Thead1

{

a=1;

b=2

}

Thread2

{

if(b==2)

{

System.out.println(a); //这个a会是多少?

}

} 上例中Thread2并不一定会打出1来,因为在Thread1中的两个指令会被编译器优化时交换了顺序,出现了与我们想像中不一样的逻辑。

3.增加synchronize抑制内存指令重排序

synchronize的作用是什么呢,经常都说是同步,市面上的说法是,jvm在运行的时候,变量会在本地有一个内存区,另外还有一个主存区,同步的含义就是将本地的值同步到主存去。

这个说法没有明确的错误,而且在一定程度上还能帮助你理解synchronize的作用,然而内部真正的原因,是利用synchronize建立内存屏障,使其能够抑制内存指令的重排序,从而使并发程序达到我们想像中的逻辑。

int a=b=0;

Thead1

{

synchronized(this)

{

a=1;

b=2;

}

}

Thread2

{

synchronized(this)

{

if(b==2)

{

System.out.println(a); //这个a会是多少?

}

}

} 这样子,代码就不会有逻辑上的问题。

4.增加volatile建立内存屏障

volatile简化了synchronized,原理是一样的。

在增加了volatile后,那个变量所使用的位置就立起了一道 内存屏障,前后的指令顺序都不可打乱。

int a=0;

volatile  int b=0;

Thead1

{

a=1;

b=2;

}

Thread2

{

if(b==2)

{

System.out.println(a); //这个a会是多少?

}

} 这就可以简化上一个程序。

5. synchronize的object(class\this)

synchronized(object)

{

dosomething();

} 这里的object其实是为了使用其上的锁,代码等价如:

object.lock.lock();

dosomething();

object.condition.wait();

object.lock.unlock(); 【科学院两小时记忆版资料,非原版ppt内容,其中有误的地方定期更正】