Sunrpc in Linux Kernel

RPC代碼位于net/sunrpc/

幾個概念

以下信息可以在/sys/kernel/debug/sunrpc中查看

xprt (transport)

struct rpc_xprt描述,代表一個連接(可以是TCP,UDP和RDMA)瘩缆。由xprt_create_transport創(chuàng)建闹啦。

rpc client

struct rpc_clnt描述焙压,代表一個client handle。由rpc_create創(chuàng)建,它會創(chuàng)建transport括荡,并發(fā)送ping,判斷是否對方支持這個RPC

rpc message

struct rpc_message描述综看,代表一個rpc message脾拆,在創(chuàng)建task時候需要描述rpc message馒索,里面包括傳輸?shù)膮?shù),返回的參數(shù)地址名船,發(fā)生/接收時候用到編碼/解碼函數(shù)等绰上。

rpc task

struct rpc_task描述,代表一個task,內(nèi)部是一個有限狀態(tài)機渠驼。

RPC 除調(diào)度之外的其它接口

  • rpc_create //返回rpc_clnt
  • xprt_create_transport //返回rpc_xprt,代表一個TCP連接
  • rpc_create_xprt //根據(jù)rpc_xprt,返回一個rpc_clnt

RPC task數(shù)據(jù)結(jié)構(gòu)

每個Task(struct rpc_task)就是一個有限狀態(tài)機蜈块,狀態(tài)機運行完畢表示這個task運行完畢。

RPC Task 調(diào)度函數(shù)

  • rpc_execute //運行狀態(tài)機
  • rpc_run_task //用rpc_task_setup描述task渴邦,對rpc_execute的封裝
  • rpc_call_sync //用rpc_message描述task疯趟,對rpc_run_task的封裝
  • rpc_call_async //用rpc_message描述task,對rpc_run_task的封裝
  • rpc_call_start //將task->tk_action設(shè)置為call_start

rpc_execute()中谋梭,如果task需要prepare,狀態(tài)機從rpc_prepare_task()開始運行,否則從call_start開始信峻。

NFS Client構(gòu)造RPC request

NFS Client是sunrpc重要客戶,NFS的RPC請求本質(zhì)上都是構(gòu)造struct rpc_task瓮床,然后調(diào)用rpc_run_task完成的盹舞。

調(diào)用rpc_call_sync()

=>rpc_call_sync() => rpc_run_task() => rpc_execute()
參見nfs4_proc_exchange_id的實現(xiàn)

調(diào)用rpc_call_async()

=>rpc_call_async() => rpc_run_task() => rpc_execute()
參見nfs4_proc_async_renew的實現(xiàn)

直接調(diào)用rpc_run_task()

參見nfs41_proc_reclaim_complete的實現(xiàn)。
需要注意的是隘庄,rpc_task狀態(tài)機還提供了一些callback踢步,允許在運行之前和之后會被調(diào)用。例如:

static const struct rpc_call_ops nfs4_reclaim_complete_call_ops = {
    .rpc_call_prepare = nfs4_reclaim_complete_prepare,
    .rpc_call_done = nfs4_reclaim_complete_done,
    .rpc_release = nfs4_free_reclaim_complete_data,
};

RPC Task 狀態(tài)機 狀態(tài)轉(zhuǎn)移

__rpc_execute是RPC的處理函數(shù)丑掺,本質(zhì)上是一個有限狀態(tài)機FSM获印。如果是同步RPC,由rpc_execute調(diào)用街州。如果是異步RPC,由rpc_execute插入到work queue中調(diào)用兼丰。

__rpc_execute(struct rpc_task *task)
{
    for(;;)
    {
         task->tk_callback(); //如call_start玻孟,call_reserve等。在這里修改tk_callback
    }
}

rpc_call_start() => call_start => call_reserve => call_refresh => ... => call_connect => 等等

  • call_start //0. Initial state
  • call_reserve //1. Reserve an RPC call slot
  • call_refresh //2. Bind and/or refresh the credentials
  • rpc_xdr_encode //3. Encode arguments of an RPC call
  • call_bind //4. Get the server port number if not yet set
  • call_transmit //5. Transmit the RPC request, and wait for reply
  • call_status //6. Sort out the RPC call status
  • call_decode //7. Decode the RPC reply

work queue

sun rpc里邊會使用三個workqueue鳍征,分別是rpciod_workqueue黍翎,xprtiod_workqueue,nfsiod_workqueue艳丛。

  • rpciod_workqueue:調(diào)用__rpc_execute運行rpc task狀態(tài)機匣掸。同步RPC調(diào)用運行在調(diào)用者的運行上下文,異步RPC在這個work queue執(zhí)行__rpc_execute氮双。
  • xprtiod_workqueue:處理網(wǎng)絡(luò)收發(fā)(在Linux 4.4中還沒有這個)
  • nfsiod_workqueue:rpc task使用結(jié)束后碰酝,需要調(diào)用rpc_free_task進行回收】艚叮回收可以同步砰粹,也可以異步。異步回收時在這個work queue中造挽。這是nfs的RPC請求時提供的碱璃。

統(tǒng)計參數(shù)

/proc/net/rpc/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饭入,隨后出現(xiàn)的幾起案子嵌器,更是在濱河造成了極大的恐慌,老刑警劉巖谐丢,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爽航,死亡現(xiàn)場離奇詭異,居然都是意外死亡乾忱,警方通過查閱死者的電腦和手機讥珍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窄瘟,“玉大人衷佃,你說我怎么就攤上這事√愦校” “怎么了氏义?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長图云。 經(jīng)常有香客問我惯悠,道長,這世上最難降的妖魔是什么竣况? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任克婶,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸠补。我一直安慰自己萝风,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布紫岩。 她就那樣靜靜地躺著,像睡著了一般睬塌。 火紅的嫁衣襯著肌膚如雪泉蝌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天揩晴,我揣著相機與錄音勋陪,去河邊找鬼。 笑死硫兰,一個胖子當著我的面吹牛诅愚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劫映,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼违孝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泳赋?” 一聲冷哼從身側(cè)響起雌桑,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祖今,沒想到半個月后校坑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡千诬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年耍目,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徐绑。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡邪驮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泵三,到底是詐尸還是另有隱情耕捞,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布烫幕,位于F島的核電站俺抽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏较曼。R本人自食惡果不足惜磷斧,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弛饭,春花似錦冕末、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至憔晒,卻和暖如春藻肄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拒担。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工嘹屯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人从撼。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓州弟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親低零。 傳聞我的和親對象是個殘疾皇子婆翔,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351