Drbd
DRBD 資源狀態
我目前正在使用 DRBD 在兩台機器上複製 samba 文件伺服器。有時在主伺服器上寫入失敗,發生這種情況時資源狀態(使用 cat /proc/drbd)為:
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate A r---n
當一切正常時,狀態是:
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate A r----
我能看到的唯一區別是行尾的“n”。我認為這與擁塞無關,因為它發生在資源上沒有活動時。使用 drbdadm 斷開和重新連接可以解決問題。
所以,我的問題是:那個’n’是什麼意思?
謝謝您的幫助!
我還沒有找到關於這些位的一些文件,所以我在 drbd-8.3.4 原始碼中進行了探勘。“n”實際上與同步擁塞有關。這是程式碼:
這是更新 /proc/drbd 的呼叫
在 drdb/drbd_main.c
seq_printf(seq, 201 "%2d: cs:%s ro:%s/%s ds:%s/%s %c %c%c%c%c%c\n" 202 " ns:%u nr:%u dw:%u dr:%u al:%u bm:%u " 203 "lo:%d pe:%d ua:%d ap:%d ep:%d wo:%c", 204 i, sn, 205 drbd_role_str(mdev->state.role), 206 drbd_role_str(mdev->state.peer), 207 drbd_disk_str(mdev->state.disk), 208 drbd_disk_str(mdev->state.pdsk), 209 (mdev->net_conf == NULL ? ' ' : 210 (mdev->net_conf->wire_protocol - DRBD_PROT_A+'A')), 211 mdev->state.susp ? 's' : 'r', 212 mdev->state.aftr_isp ? 'a' : '-', 213 mdev->state.peer_isp ? 'p' : '-', 214 mdev->state.user_isp ? 'u' : '-', 215 mdev->congestion_reason ?: '-', 216 mdev->send_cnt/2, 217 mdev->recv_cnt/2, 218 mdev->writ_cnt/2, 219 mdev->read_cnt/2, 220 mdev->al_writ_cnt, 221 mdev->bm_writ_cnt, 222 atomic_read(&mdev->local_cnt), 223 atomic_read(&mdev->ap_pending_cnt) + 224 atomic_read(&mdev->rs_pending_cnt), 225 atomic_read(&mdev->unacked_cnt), 226 atomic_read(&mdev->ap_bio_cnt), 227 mdev->epochs, 228 write_ordering_chars[mdev->write_ordering] 229 );
這意味著“n”欄位來自擁塞原因。這是在以下程式碼中設置的(第 3171 行):
在 drdb/drbd_main.c
3140 /** 3141 * drbd_congested() - Callback for pdflush 3142 * @congested_data: User data 3143 * @bdi_bits: Bits pdflush is currently interested in 3144 * 3145 * Returns 1<<BDI_async_congested and/or 1<<BDI_sync_congested if we are congested. 3146 */ 3147 static int drbd_congested(void *congested_data, int bdi_bits) 3148 { 3149 struct drbd_conf *mdev = congested_data; 3150 struct request_queue *q; 3151 char reason = '-'; 3152 int r = 0; 3153 3154 if (!__inc_ap_bio_cond(mdev)) { 3155 /* DRBD has frozen IO */ 3156 r = bdi_bits; 3157 reason = 'd'; 3158 goto out; 3159 } 3160 3161 if (get_ldev(mdev)) { 3162 q = bdev_get_queue(mdev->ldev->backing_bdev); 3163 r = bdi_congested(&q->backing_dev_info, bdi_bits); 3164 put_ldev(mdev); 3165 if (r) 3166 reason = 'b'; 3167 } 3168 3169 if (bdi_bits & (1 << BDI_async_congested) && test_bit(NET_CONGESTED, &mdev->flags)) { 3170 r |= (1 << BDI_async_congested); 3171 reason = reason == 'b' ? 'a' : 'n'; 3172 } 3173 3174 out: 3175 mdev->congestion_reason = reason; 3176 return r; 3177 }
希望這可以幫助