終于從歡躍數(shù)碼出來(lái)了。離開(kāi)了成都。
這邊很迅速的辦好了各種手續(xù),房子也租上了,白菜也搬過(guò)來(lái)了。東西還沒(méi)有寄到,主要是車(chē),可能老馬都還沒(méi)給寄。
有點(diǎn)流水賬的感覺(jué)了。。。其實(shí)這段時(shí)間事情太多了。也算了經(jīng)歷了人生一大轉(zhuǎn)折,正式轉(zhuǎn)型到管理層了。有很多想法。慢慢來(lái)。
在裝新的工作機(jī)。卡位暫時(shí)安排在程序這邊。
裝補(bǔ)丁要重啟機(jī)器了。下次慢慢寫(xiě)。
posted @
2009-10-12 13:00 大日如來(lái) 閱讀(287) |
評(píng)論 (0) |
編輯 收藏
比如我開(kāi)了2個(gè)終端,ttyp1空著,在ttyp2上gdb loginserver跑起來(lái)之后,who看有ttyp1和ttyp2,ttyp1上有bash,sshd,ttyp2上有bash,sshd,gdb,loginserver。
我關(guān)了ttyp2,再看who只有ttyp1了,ttyp2上的bash和sshd沒(méi)了,但是gdb和loginserver還在,假如我kill掉loginserver,gdb也會(huì)跟著關(guān)掉,我現(xiàn)在想要gdb和loginserver重新回到ttyp1的控制里,感覺(jué)上就是從ttyp1的STDIN里讀,往ttyp2的STDOUT里寫(xiě),怎么做?
gettty貌似有這個(gè)功能,但是他不算是一個(gè)utility tools,watch可以,帶-W參數(shù)還可以寫(xiě),但是需要root權(quán)限,而且還是和接管這種感覺(jué)差了一點(diǎn),因?yàn)槲覍?duì)服務(wù)器管理實(shí)在很差,哪位看到了知道怎么做可以留言給我,不甚感激。
posted @
2008-05-12 01:26 大日如來(lái) 閱讀(1437) |
評(píng)論 (1) |
編輯 收藏
又是一個(gè)月沒(méi)寫(xiě)B(tài)LOG了,這一個(gè)月回家基本都不怎么碰電腦,更換平臺(tái)也一段時(shí)間了,F(xiàn)reeBSD留給我的印象最大的是穩(wěn)定,其次是反應(yīng)很干脆,比如程序有什么BUG,直接SIGSEGV,比如:
int a = 5;
printf("%s", a);
這個(gè)在WIN32平臺(tái)上只可能是未知結(jié)果,F(xiàn)reeBSD就報(bào)了錯(cuò)誤。
還有就是FreeBSD和WIN32的內(nèi)存管理完全是2個(gè)極端,WIN32在物理內(nèi)存閑置的時(shí)候都占用了一半的虛擬內(nèi)存,而FreeBSD僅僅是在物理內(nèi)存被吃完,留下512K開(kāi)始使用虛擬內(nèi)存。
個(gè)人感覺(jué),這樣的區(qū)別是來(lái)自一個(gè)做桌面,一個(gè)做服務(wù),做桌面的總有一些慢輪詢(xún)需要處理,比如圖標(biāo)的cache啊,各種狀態(tài)的保存啊,很占內(nèi)存的東西,但是又不是實(shí)時(shí)的使用,留在物理內(nèi)存里純屬浪費(fèi),而FreeBSD一開(kāi)始設(shè)計(jì)的時(shí)候根本沒(méi)有圖形界面,純純一個(gè)terminal,需要的東西內(nèi)核都幫你做了,你可以隨意開(kāi)關(guān)你認(rèn)為必要不必要的東西,所以FreeBSD做服務(wù)端非常合適的。
終于還是把GC加到了服務(wù)端里面,mapserver內(nèi)存從960M漲到了1560,效率上沒(méi)怎么測(cè)試,穩(wěn)定性感覺(jué)略微有點(diǎn)下降,好處可能要在實(shí)際應(yīng)用中才能體會(huì)了。
posted @
2008-05-12 01:23 大日如來(lái) 閱讀(315) |
評(píng)論 (0) |
編輯 收藏
快到都江堰叻
從都江堰包車(chē)到青城后山
早飯+男女配角
農(nóng)家樂(lè)后得小溪
早上準(zhǔn)備爬山叻
男女配角全面登場(chǎng)
開(kāi)始上山叻
體力很充沛,還可以拍風(fēng)景
某猛男中招,拉肚子叻
剛開(kāi)始走就吃!
嘎嘎
個(gè)性男
上主題,哇哈哈哈哈
實(shí)際上大部分路都在推和抗
還有體力拍風(fēng)景
背包跑到某男身上去叻。。汗一個(gè)。
某男開(kāi)始執(zhí)掌相機(jī)
真得很耗體力。。。
到叻山腳至半山得纜車(chē)
又一村,我得車(chē)車(chē)止步于此。。。實(shí)在可惜。
我得體力透支,艱難得在往上爬
還好沒(méi)抗車(chē)上來(lái),萬(wàn)佛洞得棧道實(shí)在BT
天王殿門(mén)口,目標(biāo)在望
多謝2位帥哥一路陪我
下又一村做得纜車(chē),45,貴就一個(gè)字。。。
又一村取上車(chē),因?yàn)檫€要騎回成都,本來(lái)打算繼續(xù)做纜車(chē),結(jié)果被告知要排至少2個(gè)小時(shí)隊(duì)
一咬牙一跺腳,推下山
相機(jī)被某男拿走,沒(méi)得照片叻。
回到后山,居然輕松爬上回去得半山,然后放坡57到前山。
都江堰一頓30晚飯。
吃到天黑,摸黑30碼拉回成都。
到家10:30不到。
最后總結(jié)。。抗車(chē)上山是個(gè)很拉風(fēng)很自虐得行為。
準(zhǔn)備上山得路上旁邊賣(mài)黃瓜得都在說(shuō) 小伙子,車(chē)子上不去得。
半路上不斷有人嘀咕,自行車(chē)怎么上得山
上了山只想爽快得吼出來(lái)。
其實(shí)我也不太懂怎么會(huì)抗車(chē)上山,一開(kāi)始只是退了農(nóng)家樂(lè)得房子,寄存下來(lái)不放心,爬叻一截就只剩一個(gè)想法,一定要上去。
posted @
2008-05-12 00:38 大日如來(lái) 閱讀(291) |
評(píng)論 (0) |
編輯 收藏
上一篇 說(shuō)了問(wèn)題。現(xiàn)在說(shuō)說(shuō)重構(gòu)后的構(gòu)架。
基于freebsd6.3 boost-1.35.0(多處升級(jí),最重要是包含了asio,升級(jí)了thread) STLport-5.1.5 消息隊(duì)列(msgget,msgsnd,msgrcv)
構(gòu)架方便借鑒了部分
云風(fēng)的思路。
loginserver,gate,gamedb,postoffice,mapserver
accountdb去掉了,整合進(jìn)loginserver里,loginserver直接連oracle,取列表信息后去連gate,gate連gamedb負(fù)責(zé)發(fā)人物列表

家里機(jī)器只有畫(huà)圖。。。忍著看吧。。。
下面開(kāi)始都是一個(gè)服為一個(gè)單位。
一個(gè)服的gate是可以隨時(shí)開(kāi)關(guān)的,gate起來(lái)的時(shí)候會(huì)給loginserver和postoffice注冊(cè)
1 struct GateInfo
2 {
3 char name[25];
4 char ip[16];
5 short port;
6 uint online;
7 };
8
9 typedef vector<GateInfo*> VecGateInfo;
10 VecGateInfo _gateinfo;
11
12 // 當(dāng)有用戶(hù)連上或者斷開(kāi)gate時(shí)
13 sort(_gateinfo.begin(), _gateinfo.end(), GateSort)
14
15 // 這樣client取gate信息的時(shí)候只需要發(fā)給每個(gè)gate_group的第一個(gè)就行。
gamedb是所有userinfo的集結(jié)地,有緩存,只在第一次請(qǐng)求的時(shí)候把userinfo讀進(jìn)緩存,其余時(shí)刻都是寫(xiě),一個(gè)慢線程,5分鐘輪詢(xún)寫(xiě)一遍,某個(gè)user更新發(fā)給gamedb,由gamedb負(fù)責(zé)通知其他拷貝同步更新。
mapserver實(shí)際上是一堆服務(wù)端的組合總稱(chēng),這塊來(lái)自云風(fēng)的構(gòu)架,分為chatserver(聊天服務(wù)端),mapserver(地圖服務(wù)端,還可以區(qū)分為只帶功能性npc地圖,或者稱(chēng)為非pk地圖,和其他地圖),guildserver,dropserver。。。每個(gè)server都和postoffice連接,并且按功能和gamedb和其他服務(wù)端連接,按功能劃分具體的服務(wù)端可以很好的把邏輯分散,不會(huì)導(dǎo)致某個(gè)模塊的bug整個(gè)服務(wù)端的崩潰,在程序員整體調(diào)試水平不高的情況下,大大降低出錯(cuò)后分析的難度。
相比較以前來(lái)說(shuō)就是gamedb后移,數(shù)據(jù)重心放在gamedb上,只讀一次的做法要嚴(yán)格保證gamedb的效率和穩(wěn)定,否則會(huì)死的很抽象。
一些細(xì)節(jié)mark下來(lái),boost+asio在freebsd上居然不用kqueue用的是select。。。Orz,這是我在一次單步跟一個(gè)內(nèi)存錯(cuò)誤發(fā)現(xiàn)的
1 //
2 // kqueue_reactor_fwd.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 // Copyright (c) 2005 Stefan Arentz (stefan at soze dot com)
7 //
8 // Distributed under the Boost Software License, Version 1.0. (See accompanying
9 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10 //
11
12 #ifndef BOOST_ASIO_DETAIL_KQUEUE_REACTOR_FWD_HPP
13 #define BOOST_ASIO_DETAIL_KQUEUE_REACTOR_FWD_HPP
14
15 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
16 # pragma once
17 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18
19 #include <boost/asio/detail/push_options.hpp>
20
21 #if !defined(BOOST_ASIO_DISABLE_KQUEUE)
22 #if defined(__MACH__) && defined(__APPLE__)
23
24 // Define this to indicate that epoll is supported on the target platform.
25 #define BOOST_ASIO_HAS_KQUEUE 1
26
27 namespace boost {
28 namespace asio {
29 namespace detail {
30
31 template <bool Own_Thread>
32 class kqueue_reactor;
33
34 } // namespace detail
35 } // namespace asio
36 } // namespace boost
37
38 #endif // defined(__MACH__) && defined(__APPLE__)
39 #endif // !defined(BOOST_ASIO_DISABLE_KQUEUE)
40
41 #include <boost/asio/detail/pop_options.hpp>
42
43 #endif // BOOST_ASIO_DETAIL_KQUEUE_REACTOR_FWD_HPP
反正我只是不負(fù)責(zé)任的把22和38行屏蔽掉而已。
消息隊(duì)列只傳遞指針,意思就是某個(gè)消息由接收方alloc,然后msgsnd這塊內(nèi)存的指針,msgrcv收到這個(gè)指針,處理完了free掉,而不是整個(gè)消息放進(jìn)去。
1 struct mymsg {
2 long int mtype; /* message type */
3 char mtext[4]; /* message text */
4 }
5
說(shuō)實(shí)話(huà)當(dāng)初在msgsnd msgrcv上調(diào)試了很久
1 char* packet;// 假設(shè)這個(gè)packet包括了傳進(jìn)來(lái)的包
2 mymsg* msg = (mymsg*)mem_alloc(sizeof(mymsg));
3 memcpy(msg->mtext, &packet, sizeof(char*));
4 msgsnd(msgid, msg, sizeof(char*),0)
然后死活提示參數(shù)不正確。。。
逐字逐句讀了man msgsnd數(shù)十遍之后發(fā)現(xiàn)。。。問(wèn)題在msg->mtype不能等于0
ok,公司物理斷網(wǎng),usb口物理破壞。。。囧。。。當(dāng)然,我要起帶頭作用,忍。。。
posted @
2008-04-09 22:42 大日如來(lái) 閱讀(2359) |
評(píng)論 (2) |
編輯 收藏
以前的服務(wù)端是win32平臺(tái),STLport-5.1.4,boost-1.34.1,asio-0.3.8,apr的內(nèi)存管理,消息池用的是MSMQ。
構(gòu)架是loginserver,accountdb,gate,gamedb,gameserver,數(shù)據(jù)流向是:帳號(hào)密碼->loginserver->accountdb->loginserver->client->選區(qū)->gate->gamedb->gate->client->選人->gate->gameserver
先說(shuō)說(shuō)現(xiàn)在的問(wèn)題,win32平臺(tái)就不說(shuō)了^_^,也不談stlport boost的效率問(wèn)題,msmq也中規(guī)中矩,主要是apr的問(wèn)題,使用的是這樣的形式來(lái)做的內(nèi)存管理
1 struct cUser
2 {
3 apr_pool_t* pool;
4
5 char name[25];
6 ushort level;
7 
8 };
9
10 // 申請(qǐng)
11 apr_pool_t* pool = 0;
12 apr_pool_create(_mainpool, &pool);
13 cUser* user = (cUser*)apr_pcalloc(pool, sizeof(cUser));
14 user->pool = pool;
15 strcpy_s(user->name, "test");
16 user->level = 0;
17
18 // 釋放
19 if (user)
20 {
21 if (user->pool)
22 apr_pool_destory(user->pool);
23 }
服務(wù)端運(yùn)行過(guò)程中很偶爾會(huì)出現(xiàn)user->pool為空,因?yàn)獒尫攀浅绦蚪Y(jié)束時(shí)統(tǒng)一釋放,所以沒(méi)有理由懷疑釋放錯(cuò)誤,只能是內(nèi)存越界,比如
1 apr_pool_t* pool = 0;
2 apr_pool_create(mainpool, &pool);
3
4 cUser* user = (cUser*)apr_pcalloc(pool, sizeof(cUser) * 20);
5
6 for (int i = 0; i < 20; i++)
7 user[i].pool = pool;
8
9 // 這只是個(gè)示例,當(dāng)然不會(huì)有人這么做
10 // 假設(shè)cUser最后一個(gè)變量是 char temp[100];
11 struct cUser
12 {
13 apr_pool_t* pool;
14
15 char name[25];
16 ushort level;
17 char temp[100];
18 };
19 memcpy(user[0].temp, "test", 104);
20 // 這個(gè)時(shí)候user[1]的pool就是空的了。
因?yàn)闃?gòu)架是我做的,具體邏輯不是我寫(xiě)的,在幾十萬(wàn)行代碼里一點(diǎn)一點(diǎn)跟哪里出錯(cuò)實(shí)在太渺茫,而且有點(diǎn)懷疑apr內(nèi)部是否有bug,因?yàn)榭村e(cuò)誤的內(nèi)存,明顯整個(gè)user都是被apr_pool_destroy掉的。so。。這次不用apr了,那么大個(gè)庫(kù)使用一個(gè)apr_pool是有點(diǎn)殺雞牛刀的感覺(jué)。
這次簡(jiǎn)簡(jiǎn)單單定義
void* mem_alloc(size_t size);
void* mem_realloc(void* p, size_t size);
void mem_free(void* p);
// 實(shí)現(xiàn)
void* mem_alloc(size_t size)
{
void* p = 0;
p = malloc(size);
#ifdef _DEBUG
if (p)
memset(p, 0, size);
#endif
return p;
}
void* mem_realloc(void* p, size_t size)
{
void* p = 0;
p = realloc(p, size);
return p;
}
void mem_free(void* p)
{
if (p)
{
free(p);
p = 0;
}
}
當(dāng)然后面打算帶上gc,暫時(shí)直接申請(qǐng)內(nèi)存方便valgrind挑錯(cuò)。
構(gòu)架的問(wèn)題就大了,一開(kāi)始的設(shè)計(jì)是單loginserver多gate,單gate對(duì)單gameserver,后來(lái)發(fā)現(xiàn)一個(gè)gameserver帶30幾張地圖,跑5000+npc簡(jiǎn)直就是自殘,于是改,改單gate帶多gameserver,問(wèn)題來(lái)了,我們的構(gòu)架是gamedb只和gate聯(lián)系,一旦跨地圖組隊(duì),user信息就要從一個(gè)gameserver帶到gate再發(fā)給另一個(gè)gameserver,以前只考慮了由gate保存user信息,gameserver只是一份copy,更新數(shù)據(jù)方便,但是現(xiàn)在gate的負(fù)擔(dān)超級(jí)重。
還有數(shù)據(jù)庫(kù)問(wèn)題,用的oracle,oci直接操作,accountdb沒(méi)問(wèn)題,gamedb是來(lái)了請(qǐng)求就去數(shù)據(jù)庫(kù)拿或者寫(xiě),沒(méi)有做user的緩存,而且是整個(gè)user結(jié)構(gòu)體帶來(lái)帶去,通信量特別大。結(jié)果是經(jīng)常報(bào)告statement操作的游標(biāo)過(guò)多,提高oracle的64個(gè)游標(biāo)數(shù)量只是暫時(shí)解決方案。經(jīng)常選了服就卡住,拿不到人物信息。
最主要就是msmq輪詢(xún)?nèi)∠rocess的時(shí)候沒(méi)有用阻塞模式(或者沒(méi)有阻塞模式?)
1 if (0 == MSMQGetMessage(
))
2 {
3 Sleep(1);
4 }
5 else
6 {
7 Process_Packet(
);
8 }
問(wèn)題出在這個(gè)sleep(1)上了,不sleep,4個(gè)msmq線程,npc的process被搶的什么都干不成,sleep的話(huà)cpu就死活利用不上去。懶得找msmq的阻塞模式了。
還有就是設(shè)計(jì)上的問(wèn)題了,比如
1 struct User_Save_Info
2 {
3 char name[25];// 沒(méi)問(wèn)題,12個(gè)中文字的名字。
4 int gender;// 性別,大哥,你有42億種性別么?
5 int facestyle;// 臉型,同上
6 int hairstyle;// 發(fā)型,同上
7
// 后面類(lèi)似的不說(shuō)了。
8 };
我就說(shuō)策劃大哥們,我為了省包頭的2字節(jié)絞盡腦汁,你們可好。。。無(wú)語(yǔ)了。。。
Item_Info_Save是存裝備的,我們的裝備有隨機(jī)屬性,但是他們居然把裝備的通用屬性都由服務(wù)器來(lái)發(fā),最郁悶的是設(shè)計(jì)npc死亡掉落物品數(shù)量達(dá)到50件。。。就是一個(gè)npc死亡,我需要發(fā)8(小隊(duì)人數(shù))*50(裝備個(gè)數(shù))*sizeof(Item_Info_Save)(這個(gè)sizeof至少100字節(jié))。。。
ok問(wèn)題暫時(shí)說(shuō)到這里,下一貼說(shuō)重構(gòu)后的改動(dòng)。
posted @
2008-04-09 00:01 大日如來(lái) 閱讀(2487) |
評(píng)論 (10) |
編輯 收藏
系 統(tǒng) |
配 件 |
型 號(hào) |
價(jià) 格 |
備 注 |
車(chē)身 |
車(chē)架 |
BIGCAT COMPLITE |
¥450 |
|
前叉 |
SUNTOUR XCR |
¥640 |
油壓線控鎖 |
立管 |
UNO四釘 |
¥40 |
|
副把 |
|
|
|
把橫 |
X MISSION直把 |
¥20 |
|
把套 |
PRO TEN |
¥25 |
|
碗組 |
|
|
|
坐管 |
ZOOM全鋁 27.2 |
¥30 |
無(wú)標(biāo) |
坐墊 |
WTB SPEED V COMP |
¥230 |
|
坐夾 |
鋁合金快拆 |
¥10 |
|
車(chē)首墊環(huán) |
SCOTT鋁合金 |
|
|
傳動(dòng) |
牙盤(pán) |
SHIMANO M440 9S |
¥230 |
|
中軸 |
清豪CH52軸承 |
¥30 |
|
腳踏 |
FPD NWL90 |
¥45 |
|
飛輪 |
SRAM PG950 |
¥130 |
|
鏈條 |
SHIMANO HG73 |
¥60 |
|
輪組 |
花鼓 |
QUANDO 昆騰滾珠碟剎 |
¥150 |
|
車(chē)圈 |
ALEX DP20碟剎專(zhuān)用 |
¥150 |
|
鋼絲 |
電鍍黑不銹鋼 |
¥35 |
|
胎墊 |
XXF尼龍高壓 |
¥20 |
|
內(nèi)胎 |
KENDA建大 |
¥20 |
|
外胎 |
建大26*1.95 |
¥60 |
|
變速 |
指撥 |
SHIMANO DEORE M510 |
¥230 |
|
前撥 |
SHIMANO DEORE M510 |
¥130 |
|
后撥 |
SHIMANO XT M760 |
¥320 |
|
制動(dòng) |
剎把 |
AVID FR5 |
¥85 |
|
夾器 |
HAYES MX1 |
¥350 |
|
碟片 |
|
|
|
其他 |
馬表 |
SIGMA BC906 |
¥100 |
|
前燈 |
|
|
|
尾燈 |
MC18 |
¥20 |
|
鏈貼 |
SHIMANO XTR |
¥5 |
|
水壺 |
|
|
|
水壺架 |
閃電鋁合金 |
¥10 |
|
貨架 |
|
|
|
全車(chē)線 |
JAGWIRE套裝 |
¥20 |
|
總價(jià) |
|
|
¥3,645 |
|
posted @
2008-03-18 17:33 大日如來(lái) 閱讀(560) |
評(píng)論 (1) |
編輯 收藏
一開(kāi)始是這樣,某個(gè)程序在debug模式下寫(xiě)的一段附魔效果的代碼,測(cè)試正常后提交。
我這里release編譯,F(xiàn)5測(cè)試了沒(méi)問(wèn)題。提交測(cè)試人員后被告知沒(méi)有附魔效果。我繼續(xù)F5測(cè)試沒(méi)任何問(wèn)題,和測(cè)試人員爭(zhēng)執(zhí)后發(fā)現(xiàn)。。。
如果用掛著調(diào)試器沒(méi)有任何問(wèn)題,直接雙擊exe就是沒(méi)有效果。
最后發(fā)現(xiàn)是一個(gè)變量沒(méi)有在類(lèi)構(gòu)造的時(shí)候初始化。
是一個(gè)bool類(lèi)型的變量,問(wèn)題是,為什么掛這調(diào)試器這個(gè)變量就是true,直接雙擊exe這個(gè)變量就是false???
posted @
2008-03-18 17:22 大日如來(lái) 閱讀(2180) |
評(píng)論 (6) |
編輯 收藏