锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
LT涓鑸敤鍦ㄥ崟綰跨▼銆?/span>
ET鍜孍POLLONESHOT閰嶅悎鐢ㄥ湪澶氱嚎紼嬪叡浜竴涓猠poll鐜涓嬶紝EPOLLONESHOT鏍囪瑙﹀彂榪囩殑浜嬩歡浠巈poll涓Щ闄わ紝涓嬫蹇呴』閲嶆柊娉ㄥ唽錛岀敤鏉ラ槻姝㈠綰跨▼鍚屾椂鍙栧埌鍚屼竴涓猻ocket鐨勪簨浠朵駭鐢熷啿紿併?/span>
epoll_wait 絎笁涓弬鏁?鍙栦簨浠舵暟閲忥細
鍗曠嚎紼嬫ā鍨嬪綋鐒跺敖鍙兘涓嬈″鍙栦竴浜涙晥鐜囬珮錛屽綰跨▼涓轟簡闃叉涓涓嚎紼嬫妸鎵鏈変簨浠跺彇瀹屽叾浠栫嚎紼嬮ゥ楗匡紝ACE瀹炵幇鏄彧鍙?涓?/span>
閿欒澶勭悊錛?/span>
EAGIN | EINTR | EWOULDBLOCK 閲嶈瘯銆?/span>
EPOLLERR | EPOLLHUP | EPOLLRDHUP 鏂紑榪炴帴銆?/span>
鎯婄兢錛?/span>
榛樿緋葷粺閮戒細鏈夎繖闂錛屾嵁璇存柊緋葷粺鏈変慨澶嶄笉榪囪繕鏄鐞嗕竴涓嬫瘮杈冨ソ錛屼竴鑸В鍐蟲柟妗堟槸鍚屾椂鍙湁涓涓嚎紼嬬瓑寰卆ccept錛屽彲浠ュ崟鐙嚎紼媋ccept錛屽皢榪炴帴鍦ㄥ垎緇欏叾浠栧伐浣滅嚎紼嬨俷ginx鏄榪涚▼妯″瀷錛屼嬌鐢ㄤ簡鍩轟簬鍏變韓鍐呭瓨鐨勪簰鏂ラ攣錛屼嬌寰楀悓鏃跺彧鏈変竴涓伐浣滆繘紼嬬殑epoll鍚湁accept鐨剆ocket錛岄氳繃榪欑鏂瑰紡瀹炵幇榪炴帴鏁頒笂鐨勮礋杞藉潎琛★紙榪炴帴鏁板皯鐨勫伐浣滆繘紼嬪緱鍒癮ccept閿佺殑姒傜巼楂橈級銆?br />
涓轟簡閬垮厤澶ф暟鎹噺io鏃訛紝et妯″紡涓嬪彧澶勭悊涓涓猣d,鍏朵粬fd琚タ姝葷殑鎯呭喌鍙戠敓銆俵inux寤鴻鍙互鍦╢d鑱旂郴鍒扮殑緇撴瀯錛堜竴鑸兘浼氳嚜宸卞皝瑁呬竴涓寘鍚玣d鍜岃鍐欑紦鍐茬殑緇撴瀯浣擄級涓鍔爎eady浣嶏紝鐒跺悗epoll_wait瑙﹀彂浜嬩歡涔嬪悗浠呭皢鍏剁疆浣嶄負ready妯″紡錛岀劧鍚庡湪涓嬭竟杞ready fd鍒楄〃銆?/span>
epoll瀹炵幇錛?
epoll鍐呴儴鐢ㄤ簡涓涓孩榛戞爲璁板綍娣誨姞鐨剆ocket錛岀敤浜嗕竴涓弻鍚戦摼琛ㄦ帴鏀跺唴鏍歌Е鍙戠殑浜嬩歡銆?/span>
娉ㄥ唽鐨勪簨浠舵寕杞藉湪綰㈤粦鏍戜腑(綰㈤粦鏍戠殑鎻掑叆鏃墮棿鏁堢巼鏄痩ogN錛屽叾涓璶涓烘爲鐨勯珮搴?銆?/span>
鎸傝澆鐨勪簨浠朵細涓庤澶?緗戝崱)椹卞姩寤虹珛鍥炶皟鍏崇郴錛屼篃灝辨槸璇達紝褰撶浉搴旂殑浜嬩歡鍙戠敓鏃朵細璋冪敤榪欎釜鍥炶皟鏂規硶銆傝繖涓洖璋冩柟娉曞湪鍐呮牳涓彨ep_poll_callback,瀹冧細灝嗗彂鐢熺殑浜嬩歡娣誨姞鍒皉dlist鍙岄摼琛ㄤ腑銆?/span>
浣跨敤mmap鏄犲皠鍐呭瓨錛屽噺灝戝唴鏍告佸拰鐢ㄦ埛鎬佺殑涓嶅悓鍐呭瓨鍦板潃絀洪棿鎷瘋礉寮閿銆?/span>姣忔娉ㄥ唽鏂扮殑浜嬩歡鍒癳poll涓椂錛屼細鎶奻d鎷瘋礉榪涘唴鏍革紝閫氳繃鍐呮牳浜庣敤鎴風┖闂磎map鍚屼竴鍧楀唴瀛?/span>淇濊瘉浜嗗彧浼氭嫹璐濅竴嬈°傦紙榪斿洖鐨勬椂鍊欎笉闇瑕佹嫹璐濓紝select瑕侊級
鎵цepoll_ctl鏃訛紝闄や簡鎶妔ocket鏀懼埌綰㈤粦鏍戜笂錛岃繕浼氱粰鍐呮牳涓柇澶勭悊紼嬪簭娉ㄥ唽涓涓洖璋冨嚱鏁幫紝鍛婅瘔鍐呮牳錛屽鏋滆繖涓彞鏌勭殑涓柇鍒頒簡錛屽氨鎶婂畠鏀懼埌鍑嗗灝辯華list閾捐〃閲屻傛墍浠ワ紝褰撲竴涓猻ocket涓婃湁鏁版嵁鍒頒簡錛屽唴鏍稿湪鎶婄綉鍗′笂鐨勬暟鎹甤opy鍒板唴鏍鎬腑鍚庡氨鎶妔ocket鎻掑叆鍒板噯澶囧氨緇摼琛ㄩ噷浜嗐傞摼琛ㄥ張鏄氳繃mmap鏄犲皠鐨勭┖闂達紝鎵浠ュ湪浼犻掔粰鐢ㄦ埛紼嬪簭鐨勬椂鍊欎笉闇瑕佸鍒訛紙榪欎篃鏄負浠涔堟瘮select鏁堢巼楂樼殑鍘熷洜錛宔poll_wait榪斿洖鐨勫彧鏄氨緇槦鍒楋紝涓嶉渶瑕佽疆璇?涓嶉渶瑕佸鍒跺畬鎴愮殑浜嬩歡鍒楄〃錛宻elect錛宲oll瀹炵幇闇瑕佽嚜宸變笉鏂疆璇㈡墍鏈塮d闆嗗悎錛岀洿鍒拌澶囧氨緇級銆?/span>
epoll_wait鏈鍚庝細媯鏌ocket錛屽鏋滄槸 LT錛屽茍涓旇繖浜泂ocket涓婄‘瀹炴湁鏈鐞嗙殑浜嬩歡鏃訛紝鍙堟妸璇ュ彞鏌勬斁鍥炲埌鍒氬垰娓呯┖鐨勫噯澶囧氨緇摼琛ㄤ簡錛圠T姣擡T浣庢晥鐨勫師鍥狅級銆?/span>
鍙錛屽鏋滄病鏈夊ぇ閲忕殑絀洪棽錛屾棤鏁堣繛鎺ワ紝epoll鏁堢巼涓嶆瘮select楂樸?/span>
嫻嬭瘯鏁版嵁錛堜粎鏄垰鎺ヨЕgo鐨勬椂鍊欏ソ濂囧仛鐨勫弬鑰冩剰涔夌殑嫻嬭瘯錛夛細
鍚屾牱鐨勭幆澧冿紝echo鏈嶅姟鍣ㄦ祴騫跺彂io錛屽崟綰跨▼epoll qps:45000宸﹀彸錛屾瘡榪炴帴/鍗忕▼ go錛?50000澶氾紝澶氱嚎紼媏poll錛堝紑6涓猠poll錛屾瘡涓猠poll寮8綰跨▼錛屼竴鍏?8綰跨▼錛夛細qps 70000澶氥?/span>

鎱㈠惎鍔細涓寮濮嬫寚鏁扮駭鐨勫鍔犳嫢濉炵獥鍙o紝鍒頒竴涓棬闃鍊煎悗鍙樻垚綰挎х殑錛?涔嬪悗姣忔瓚呮椂閮芥妸闂ㄩ榾鍊奸檷浣庡埌鍘熸潵涓鍗婏紙騫朵笖rto緲誨嶏紝TCP瓚呮椂璁$畻鏄疪TOx2錛岃繖鏍瘋繛緇涪涓夋鍖呭氨鍙樻垚RTOx8浜嗭紝鍗佸垎鎭愭?/span>錛夛紝鎷ュ紿楀彛璁劇疆涓?閲嶆柊寮濮嬫參鍚姩錛堟寚鏁扮駭澧炲姞錛夈備竴鍒囬兘鏄負浜嗚璺敱鍣ㄦ湁鏃墮棿澶勭悊縐帇鐨勭紦鍐層傦紙鎵浠ヤ笉閫傜敤浜庨綣佹柇寮榪炴帴鐨勭Щ鍔ㄧ綉緇滐紝榪欎篃鏄負浠涔堜互鍓嶇殑涓嬭澆宸ュ叿寮澶氭潯tcp浼犺緭閫熷害鏇村揩鐨勫師鍥狅級銆?/span>
Nagle綆楁硶錛氱涓嬈★紙姝ゆ椂娌℃湁絳夊緟ack紜錛岀┖闂茶繛鎺ワ級鍙戦佸皬鍖呮垚鍔燂紝絎簩嬈$戶緇彂閫?錛氬摢鎬曞彂閫佺獥鍙o紝鎷ュ紿楀彛閮藉緢澶э紝涔嬪墠鐨勫寘娌℃湁ack紜渚濇棫涓嶈鍙戠洿鍒版敹鍒頒箣鍓嶇殑 ack紜銆?/span>
shutdown鍜宑lose鐨勫尯鍒?
close鍙槸閫掑噺寮曠敤璁℃暟錛?shutdown鐨勫崐鍏抽棴浼氬獎鍝嶆墍鏈夌殑榪涚▼銆?/span>


dpdk鏄氳繃璁稿涓嶅悓鐨勭含搴︽潵鍔犻熷寘澶勭悊鐨勶紝鍏朵腑涓昏鍖呮嫭錛?/span>
hugepage澶ч〉鍐呭瓨(榪涚▼浣跨敤鐨勬槸铏氭嫙鍦板潃錛屼竴鑸〉琛?4k)鑳芥槧灝勭殑铏氭嫙鍦板潃絀洪棿鏈夐檺錛屼嬌鐢ㄥぇ欏佃兘鍑忓皯鎹㈤〉嬈℃暟鎻愰珮cache鍛戒腑錛岄氳繃mmap鎶婂ぇ欏墊槧灝勫埌鐢ㄦ埛鎬佺殑铏氭嫙鍦板潃絀洪棿鏈夌敤榪噈map鐨勯兘鐭ラ亾榪欐槸瀹炵幇鍏變韓鍐呭瓨鐨勬墜孌碉紝鎵浠pdk榪樻敮鎸佸榪涚▼鍏變韓鍐呭瓨)
cache棰勫彇 (姣忔棰勮褰撳墠鏁版嵁鐩擱偦鍓嶅悗鐨勬暟鎹?錛屾壒閲忔搷浣滄暟鎹紝cache line瀵歸綈(閫氳繃嫻垂涓鐐瑰唴瀛樺皢瑕佹搷浣滅殑鏁版嵁瀵歸綈)
鎺ョ浜嗙綉鍗$敤鎴鋒侀┍鍔ㄤ嬌鐢ㄨ疆璇㈣屼笉鏄綉鍗′腑鏂?/span>
灝嗙綉鍗x tx闃熷垪鏄犲皠鍒扮敤鎴鋒佺┖闂村疄鐜扮湡姝g殑闆舵嫹璐濓紙浼犵粺鍫嗘爤鑷沖皯涔熷緱涓嬈℃嫹璐濓紝鍥犱負闃熷垪絀洪棿鍦ㄥ唴鏍歌屽唴鏍稿拰鐢ㄦ埛鎬佷嬌鐢ㄤ笉鍚岀殑鍦板潃絀洪棿錛?浼犵粺鍫嗘爤涓轟簡鏀寔閫氱敤鎬э紝渚嬪ipx絳夊叾浠栫綉緇滐紝灝嗗寘澶勭悊榪囩▼鍒嗕簡寰堝灞傛錛屽眰涔嬮棿鐨勬帴鍙f爣鍑嗙粺涓鏁版嵁緇撴瀯灝遍渶瑕佽漿鎹紝鏃犲艦涓甫鏉ヤ簡宸ㄥぇ鐨勬垚鏈紝濡俹si涓冨眰妯″瀷鑰屽疄鐢ㄧ殑灝辨槸tcp/ip鍥涘眰妯″瀷)
綰跨▼緇戝畾cpu
鏀寔NUMA錛屼笉鍚岀殑core灞炰簬涓嶅悓鐨刵ode錛屾瘡涓猲ode鏈夎嚜宸辯殑mempool鍑忓皯鍐茬獊
鏃犻攣鐜艦闃熷垪(鍐茬獊鍙戠敓鏃朵篃鏄竴嬈as鐨勫紑閿)
dpdk閫氳繃tools/dpdk-setup.sh鐨勮剼鏈紝閫氳繃緙栬瘧銆佹寕杞藉唴鏍告ā鍧楋紝 緇戝畾緗戝崱錛堝厛鎶婄綉鍗fconfig down錛夛紝璁劇疆hugepage鍚庡氨鍙互浣跨敤浜嗐?/span>
鍦ㄥ唴鏍告ā鍧梚gb鍔犺澆鏃訛紝浼氭敞鍐宲ci璁懼椹卞姩
static struct pci_driver igbuio_pci_driver = {
.name = "igb_uio",
.id_table = NULL,
.probe = igbuio_pci_probe,
.remove = igbuio_pci_remove,
};
鍦ㄧ粦瀹氱綉鍗℃椂錛屼細璋冪敤igbuio_pci_probe錛屼嬌鐢ㄧ敤鎴鋒侀┍鍔╱io鎺ョ緗戝崱(涓柇澶勭悊銆乵map鏄犲皠璁懼鍐呭瓨鍒扮敤鎴風┖闂?
緋葷粺鍚姩鏃訛紝bios浼氬皢璁懼鎬葷嚎鍦板潃淇℃伅璁板綍鍦?sys/bus/pci/devices錛宒pdk紼嬪簭鍚姩鏃朵細鍘昏繖閲屾壂鎻弍ci璁懼錛屾牴鎹笉鍚岀被鍨嬬殑NIC鏈夊搴旂殑鍒濆鍖栨祦紼嬨傚湪鍚庨潰閰嶇疆闃熷垪鐨勬椂鍊欎細鎶婄敤鎴鋒佺殑闃熷垪鍐呭瓨鍦板潃閫氳繃紜歡鎸囦護浜ょ粰NIC錛屼粠鑰屽疄鐜伴浂鎷瘋礉銆?/span>

濡傛灉NIC鏀跺埌鍖咃紝浼氬仛鏍囪錛岃疆璇㈢殑鏃跺欓氳繃鏍囪鍙栨暟鎹寘
while (nb_rx < nb_pkts) {
/*
* The order of operations here is important as the DD status
* bit must not be read after any other descriptor fields.
* rx_ring and rxdp are pointing to volatile data so the order
* of accesses cannot be reordered by the compiler. If they were
* not volatile, they could be reordered which could lead to
* using invalid descriptor fields when read from rxd.
*/
rxdp = &rx_ring[rx_id];
staterr = rxdp->wb.upper.status_error;
if (! (staterr & rte_cpu_to_le_32(E1000_RXD_STAT_DD)))
break;
rxd = *rxdp;
鍙戝寘鐨勮疆璇㈠氨鏄疆璇㈠彂鍖呯粨鏉熺殑紜歡鏍囧織浣嶏紝紜歡鍙戝寘瀹屾垚浼氬啓鍥炴爣蹇椾綅錛岄┍鍔ㄥ彂鐜板悗鍐嶉噴鏀懼搴旂殑鎻忚堪絎﹀拰緙撳啿鍧椼?/span>
KNI
閫氳繃鍒涘緩涓涓櫄鎷熺綉鍗★紝灝嗘敹鍒扮殑鍖呬涪緇欏崗璁爤
/* 鍙戦乻kb鍒板崗璁爤 */
/* Call netif interface */
netif_receive_skb(skb);
POWER
鍦ㄨ礋杞藉皬鐨勬椂鍊欐病鏈夊繀瑕佷嬌鐢ㄨ疆璇㈡ā寮忥紝榪欐椂鍙互鎵撳紑緗戝崱涓柇 浣跨敤eventfd epoll閫氱煡鐢ㄦ埛灞?/span>
Ring
鏃犻攣鐜艦闃熷垪鐨勬牳蹇冨氨鏄搷浣滃ご灝劇儲寮曪紝鍏堝皢澶村熬绱㈠紩璧嬬粰涓存椂鍙橀噺錛屽啀鎶婂熬绱㈠紩寰鍚庤煩n涓綅緗紝鍒╃敤cas鍒ゆ柇澶村鏋滆繕鏄湪鍘熸潵鐨勪綅緗氨鎸囧悜灝懼惁鍒欏氨閲嶅榪欎釜榪囩▼錛岀劧鍚庡湪鎿嶄綔涓棿璺寵繃鐨刵涓厓绱犲氨鏄畨鍏ㄧ殑浜嗭紝姝ゆ椂澶村熬绱㈠紩搴旇鎸囧悜鍚屼竴涓綅緗紝濡傛灉涓嶅悓搴旇鏄湁鍒殑綰跨▼涔熷湪鎿嶄綔錛岄噸澶嶇瓑寰呭嵆鍙?榪欓噷鏈変釜緇嗚妭錛岀儲寮曟槸鍙姞涓嶅噺鐨勶紝鍥犱負鏄幆褰㈤槦鍒楃儲寮曞張鏄痷nsigned 32bits錛屾墍浠ユ瘡嬈″彇鏁版嵁鍓嶆妸绱㈠紩妯¢槦鍒楅暱搴?1錛?uint32_t mask; /**< Mask (size-1) of ring. */鍗沖彲)
Windows涓嬩嬌鐢╲mware铏氭嫙鏈虹殑鏃跺欏嚭鐜癊AL: Error reading from file descriptor錛屾牴鎹綉涓婄殑璇存硶鎵撲簡patch榪樻槸涓嶈錛屽悗鏉ュ皾璇曟寕杞藉唴鏍告ā鍧楃殑鏃跺欎笉鍔犺澆vfio妯″潡灝卞彲浠ヤ簡
Redis鏄伐浣滀腑寰堝父鐢ㄧ殑錛岃繖閲屽皢姣旇緝鏅亶浣跨敤鐨勭粨鏋勭爺絀朵簡涓嬪仛涓蹇樸?/span>
hash
瀹炵幇鍜宒nspod鐨刣ataset鍗婃枻鍏袱錛屾湰璐ㄤ笂鏄釜浜岀淮鏁扮粍錛岄氳繃灝唊ey鍝堝笇浣滀負涓緇寸殑涓嬭〃錛岀浜岀淮鐨勬暟緇勫瓨鐩稿悓鍝堝笇鐨勫厓绱狅紝鏌ユ壘浣跨敤閬嶅巻鐨勬柟寮忥紝鎵浠ヨ繖閲宺edis鍋氫簡浼樺寲錛屽綋婊¤凍鏉′歡鐨勬椂鍊?鏁扮粍鏁伴噺澶ぇ)浼氳繘琛宺ehash錛屽姩鎬佹墿澶ф《鐨勬暟閲忔潵鍑忓皯鏈鍚庝竴緇撮亶鍘嗙殑嬈℃暟.
鍑芥暟鍚嶇О | 浣滅敤 | 澶嶆潅搴?/span> |
dictCreate | 鍒涘緩涓涓柊瀛楀吀 | O(1) |
dictResize | 閲嶆柊瑙勫垝瀛楀吀鐨勫ぇ灝?/span> | O(1) |
dictExpand | 鎵╁睍瀛楀吀 | O(1) |
dictRehash | 瀵瑰瓧鍏歌繘琛孨姝ユ笎榪涘紡Rehash | O(N) |
_dictRehashStep | 瀵瑰瓧鍏歌繘琛?姝ュ皾璇昍ehash | O(N) |
dictAdd | 娣誨姞涓涓厓绱?/span> | O(1) |
dictReplace | 鏇挎崲緇欏畾key鐨剉alue鍊?/span> | O(1) |
dictDelete | 鍒犻櫎涓涓厓绱?/span> | O(N) |
dictRelease | 閲婃斁瀛楀吀 | O(1) |
dictFind | 鏌ユ壘涓涓厓绱?/span> | O(N) |
dictFetchValue | 閫氳繃key鏌ユ壘value | O(N) |
dictGetRandomKey | 闅忔満榪斿洖瀛楀吀涓竴涓厓绱?/span> | O(1) |
瀛楀吀緇撴瀯
typedef struct dict {
// 綾誨瀷鐗瑰畾鍑芥暟
dictType *type;
// 縐佹湁鏁版嵁
void *privdata;
// 鍝堝笇琛?/span>
dictht ht[2];
// rehash 绱㈠紩
// 褰?rehash 涓嶅湪榪涜鏃訛紝鍊間負 -1
int rehashidx; /* rehashing not in progress if rehashidx == -1 */
// 鐩墠姝e湪榪愯鐨勫畨鍏ㄨ凱浠e櫒鐨勬暟閲?/span>
int iterators; /* number of iterators currently running */
} dict;
榪欓噷鍝堝笇琛ㄦ湁涓や釜錛屼竴鑸兘鐢╤t[0]錛屽綋闇瑕乺ehash鐨勬椂鍊欎細鍒涘緩涓涓瘮ht[0]澶х殑 2 鐨?N 嬈℃柟鐨刪t[1]錛岀劧鍚庢笎榪涘紡鐨勫皢鏁版嵁dictEntry縐昏繃鍘?闄や簡瀹氭椂鐨剅ehash錛屽湪姣忔鎿嶄綔鍝堝笇琛ㄦ椂閮戒細_dictRehashStep)錛屽畬鎴愬悗灝唄t[1]鏇挎崲ht[0]
zset
zset鏈川灝辨槸list,鍙笉榪囨瘡涓厓绱犻兘鏈夎嫢騫蹭釜鎸囧悜鍚庣戶span闀跨殑鎸囬拡錛岃繖鏍風畝鍗曠殑璁捐澶уぇ鎻愰珮浜嗘晥鐜囷紝浣垮緱鍙互姣旀嫙騫寵 浜屽弶鏍戯紝鏌ユ壘銆佸垹闄ゃ佹彃鍏ョ瓑鎿嶄綔閮藉彲浠ュ湪瀵規暟鏈熸湜鏃墮棿鍐呭畬鎴愶紝瀵規瘮騫寵 鏍戯紝璺寵穬琛ㄧ殑瀹炵幇瑕佺畝鍗曠洿瑙傚緢澶氥?/span>
/* ZSETs use a specialized version of Skiplists */
/*
* 璺寵穬琛ㄨ妭鐐?/span>
*/
typedef struct zskiplistNode {
// 鎴愬憳瀵硅薄
robj *obj;
// 鍒嗗?/span>
double score;
// 鍚庨鎸囬拡
struct zskiplistNode *backward;
// 灞?/span>
struct zskiplistLevel {
// 鍓嶈繘鎸囬拡
struct zskiplistNode *forward;
// 璺ㄥ害
unsigned int span;
} level[];
} zskiplistNode;
/*
* 璺寵穬琛?/span>
*/
typedef struct zskiplist {
// 琛ㄥご鑺傜偣鍜岃〃灝捐妭鐐?/span>
struct zskiplistNode *header, *tail;
// 琛ㄤ腑鑺傜偣鐨勬暟閲?/span>
unsigned long length;
// 琛ㄤ腑灞傛暟鏈澶х殑鑺傜偣鐨勫眰鏁?/span>
int level;
} zskiplist;
/*
* 鏈夊簭闆嗗悎
*/
typedef struct zset {
// 瀛楀吀錛岄敭涓烘垚鍛橈紝鍊間負鍒嗗?/span>
// 鐢ㄤ簬鏀寔 O(1) 澶嶆潅搴︾殑鎸夋垚鍛樺彇鍒嗗兼搷浣?/span>
dict *dict;
// 璺寵穬琛紝鎸夊垎鍊兼帓搴忔垚鍛?/span>
// 鐢ㄤ簬鏀寔騫沖潎澶嶆潅搴︿負 O(log N) 鐨勬寜鍒嗗煎畾浣嶆垚鍛樻搷浣?/span>
// 浠ュ強鑼冨洿鎿嶄綔
zskiplist *zsl;
} zset;
铏界劧榪欑鏂瑰紡鎺掑簭鏌ユ壘寰堝揩錛屼絾鏄慨鏀圭殑璇濆氨寰楀鍋氫簺宸ヤ綔浜?/span>
/* Delete an element with matching score/object from the skiplist.
*
* 浠庤煩璺冭〃 zsl 涓垹闄ゅ寘鍚粰瀹氳妭鐐?score 騫朵笖甯︽湁鎸囧畾瀵硅薄 obj 鐨勮妭鐐廣?/span>
*
* T_wrost = O(N^2), T_avg = O(N log N)
*/
int zslDelete(zskiplist *zsl, double score, robj *obj)
intset
typedef struct intset {
uint32_t encoding; //鎵浣跨敤綾誨瀷鐨勯暱搴︼紝4\8\16
uint32_t length; //鍏冪礌涓暟
int8_t contents[]; //淇濆瓨鍏冪礌鐨勬暟緇?/span>
} intset;
intset鍏跺疄灝辨槸鏁扮粍錛屾湁搴忋佹棤閲嶅鍦頒繚瀛樺涓暣鏁板鹼紝鏌ユ壘鐢ㄧ殑鏄簩鍒嗘煡鎵?* T = O(log N)錛屾坊鍔犵殑璇濆湪鎵懼埌瀵瑰簲鐨勬暟緇勪腑搴旇瀛樺湪鐨勪綅瀛愬悗浣跨敤memmove鍚戝悗縐誨嚭絀轟綅濉ˉ(褰撶劧闇瑕佸厛realloc棰勫垎閰嶇┖闂?錛屽悓鐞嗗垹闄や篃鏄敤memmove鍚戝墠縐誨姩
set
褰撲嬌鐢ㄦ暣鏁版椂錛屼嬌鐢╥ntset錛屽惁鍒欎嬌鐢ㄥ搱甯岃〃
鍏朵粬鐨勫叧浜庣綉緇滀簨浠跺鐞嗭紝epoll錛屽洖璋冿紝鎷嗗寘閮藉拰姝e父浣跨敤宸笉澶氾紝鍏充簬閿欒澶勭悊EINTR(緋葷粺璋冪敤鏈熼棿鍙戠敓涓柇)鍜孍AGAIN 緇х畫閲嶈瘯鑰屽鏋滄槸EPOLLHUP鎴朎POLLERR鍒欒io璇ヨ璇昏鍐欏啓錛屾湁閿欏鐞嗗氨鏄簡銆?/span>
dns鐨勯掑綊瑙f瀽榪囩▼榪樻槸鎸虹箒鐞愮殑錛岃鐭ラ亾涓涓煙鍚嶅彲鑳芥湁cname銆乶s 鑰岃姹傜殑cname銆乶s鍙兘榪樻湁cname銆乶s錛屽鏋滄寜鐓х嚎鎬х殑澶勭悊姣忎釜璇鋒眰閭i昏緫灝卞彉鎴愭瘺綰垮洟浜?/span>
dnspod鐨勫鐞嗚繕鏄尯宸у鐨勶紝閫氳繃涓涓叕鍏辯殑鏁版嵁闆哾ataset灝嗘墍鏈夊煙鍚嶅搴旂殑a銆乧name銆乶s絳夌被鍨嬬殑鏁版嵁浣滀負鍗曠嫭鐨勬潯鐩瓨鍏ワ紝褰撴湁闇瑕佹煇涓煙鍚嶇殑淇℃伅鏃跺厛鍘籨ataset鎵撅紝鎵句笉鍒板湪鍔犲叆qlist璇鋒眰鏍癸紝鏈変笓闂ㄧ殑綰跨▼涓嶉棿鏂殑灝唓list杞dataset鎵撅紙榪欓噷鍙嬈℃暟鍏佽錛屾病寰楀埌鎯寵鐨勭粨鏋滃氨杞鎵鏈塹list鍒癲ataset鎵捐櫧鐒跺彲浠ョ畝鍖栭昏緫鍒嗙鐨勫交搴曚絾鏄細鏄釜鎬ц兘鐡墮錛屽悗闈㈡湁鏂規錛夊綋鏍硅繑鍥炰互鍚庡彧鏄畝鍗曠殑灝嗚褰?閫氬父鏄竴涓煙鍚嶇殑cname銆乶s鎴栬卆)瀛樺叆dataset(鑰屼笉鏄戶緇祦紼嬶紝鍥犱負鏍規嵁榪欎釜榪斿洖鏄痗name榪樻槸ns鎴栬卆澶勭悊涓嶅悓閫昏緫澶嶆潅錛岃岃繖鏍峰鐞嗗浜庣敤鍒扮浉鍚屽煙鍚嶇殑璇鋒眰榪樻湁浼樺寲浣滅敤)錛屽墿涓嬬殑宸ヤ綔浜ょ粰閭h竟涓嶉棿鏂疆璇㈢殑綰跨▼
Dnspod涓昏鐢?涓猺un錛堣嫢騫蹭釜綰跨▼錛夌粍鎴?/span>
run_sentinel 鐩戝惉53绔彛鎺ユ敹瀹㈡埛绔姹傦紝灝嗚姹傛斁鍒伴槦鍒椾腑
run_fetcher 浠庨槦鍒椾腑鍙栧嚭璇鋒眰錛屾牴鎹畄name鍙栧緱鏈鍚庝竴綰name錛屾煡鐪嬫湰鍦癲ataset 鏄惁鏈夎褰曪紝濡傛灉鏈夊垯榪斿洖錛屾病鏈夊垯灝嗚璇鋒眰鏀懼叆qlist涓?/span>
run_quizzer
1.涓嶉棿鏂殑閬嶅巻qlist錛屽彧瑕佺姸鎬佷負PROCESS_QUERY涓?/span>dataset涓病鏈夌殑灝卞悜瀵瑰簲鐨勬牴鍙戦佽姹傘?/span>
2.閫氳繃epoll絳夊緟鏍硅繑鍥烇紝瑙f瀽榪斿洖鐨勬暟鎹姞鍏?dataset
3.媯鏌ヨ褰曠殑ttl錛屽湪灝嗚褰曞姞鍏ataset鏃惰繕浼氬皢榪欎簺璁板綍浠ョ孩榛戞爲鐨勫艦寮忕粍緇囪搗鏉ワ紝鍙栧緱ttl鏈鏃╁埌鏈熺殑錛屽皢鍏舵斁鍏list涓瓑寰呭埛鏂幫紝娉ㄦ剰榪欓噷涓嶆槸鍒犻櫎錛屽鏋滄敹涓嶅埌涓嶈繑鍥炲垯璇ヨ褰曚竴鐩村瓨鍦?/span>
鍏充簬dataset鐨勫疄鐜?/span>
dataset鏄嬌鐢ㄥ搱甯岃〃瀹炵幇鐨勶紝鏈川涓婃槸涓簩緇存暟緇勶紝灝嗗煙鍚嶅搱甯屾垚涓涓鹼紝妯′笂鏁扮粍鐨勬暟閲忎綔涓轟笅鏍囷紝鎵懼埌瀵瑰簲鐨勬暟緇勬帴鐫閬嶅巻鏌ユ壘錛屾牴鎹渶瑕佸彲浠ユ墿澶ф暟緇勭殑鏁伴噺鎻愬崌鎬ц兘銆?/span>
鎴戜滑鐨勪紭鍖栨墜孌?/span>
涔嬪墠鎻愬埌dnspod鐨剄list浼氫笉闂存柇杞錛屽睘浜庝富鍔ㄦ煡璇紝瀵規ц兘鏈変笉灝忕殑褰卞搷錛岃繖閲屾垜浠噰鍙栫殑鍋氭硶鏄鍔?綾諱技鍥炶皟鐨勬柟寮?錛屾垜浠皢璇鋒眰鐨勫煙鍚嶅拰綾誨瀷鍒嗙被錛岀浉鍚岀殑鏀懼湪涓緇勶紝褰揹ataset鎵句笉鍒板悜鏍瑰彂鍑鴻姹傚悗鎴戜滑騫朵笉姣忔涓誨姩杞錛岃屾槸鍦ㄧ瓑鍒板簲絳斿悗錛岃Е鍙戣鍩熷悕鍜岀被鍨嬬殑璇鋒眰緇勶紝璁╀粬浠牴鎹嚜宸辯殑閫昏緫璧頒笅涓姝ワ紙涓鑸槸鍏堟壘璇ュ煙鍚嶇殑鏈鍚庝竴綰name錛屾牴鎹繖涓猚name鏌ユ槸鍚﹀瓨鍦ㄤ粬鐨勫搴旇姹傜被鍨嬬殑璁板綍錛屼竴鑸槸a鎴栬卬s錛屽鏋滄病鏈夛紝鍒欐壘榪欎釜cname鐨刵s錛?/span>
浠ヤ笂鍙互鐪嬪嚭dataset寰堥噸瑕侊紝璐熻澆涔熶笉灝忥紝榪樼粡甯擱渶瑕佸茍鍙戣闂紝榪欓噷鎴戜滑姣忔鎺ユ敹鍒版牴鐨勫洖澶嶅悗錛岄櫎浜嗗皢璁板綍鐨勭瓟妗堝姞榪沝ataset錛岃繕鍒涘緩涓涓復鏃剁殑dataset錛屽彧瀛樿嬈″洖澶嶇殑淇℃伅錛屽湪鍚庨潰鐨勬祦紼嬩細浼樺厛鍒拌繖閲屽幓鎵撅紝娌℃湁鐨勫啀鎵綿ataset銆?/span>
鏈榪戝惉鏈嬪弸璇?.7 debug涓嬪撫鏁版彁楂?00澶氾紝鎸烘儕璁剁殑錛岄噸鏂板埌涔呰繚浜嗙殑瀹樼綉涓婁笅浜?.7.1
鐪嬩簡涓嬫覆鏌撶殑瀹炵幇(GL)
棣栧厛錛屾坊鍔犱簡GeometryBuffer鐜╂剰錛屼嬌寰楁瘡涓獁indow淇濆瓨浜嗗睘浜庤嚜宸辯殑欏剁偣鍜岀汗鐞嗕俊鎭?/p>
鐒跺悗鍦≧enderingSurface涓湁GeometryBuffer闃熷垪錛屼嬌寰楁瘡涓嫢鏈堿utoRenderingSurface灞炴х殑window鏈夊睘浜庤嚜宸辯殑闃熷垪(榛樿鍙湁FrameWindow鎵嶆湁)
鑰屽湪drawself涓墽琛岀殑鍒欐槸鍏堥氳繃looknfeel錛屾妸闇瑕佹覆鏌撶殑淇℃伅涓㈠埌姣忎釜閮ㄤ歡鑷繁鐨凣eometryBuffer閲岋紝鐒跺悗鎶奊eometryBuffer涓㈠埌RenderingSurface鐨勯槦鍒椾腑(涓鑸負
FrameWindow鐨凣eometryBuffer闃熷垪錛屾瘡涓潰鏉垮氨鏈夎嚜宸辯殑娓叉煋闃熷垪浜?
瑕佺煡閬撲互寰閮芥槸鍙湁涓涓槦鍒楃殑錛岃娓叉煋鍟ョ洿鎺ュ線閲屽銆?銆?銆?br>榪欐牱涓鏀瑰氨涓嶅繀姣忎釜灝忛儴浠舵湁鏇存敼閮借鍏ㄩ儴閲嶆柊娓呯┖娓叉煋浜?/p>
鍐嶅線鍚庡氨鏄妸姣忎釜紿楀彛闃熷垪閲岀殑GeometryBuffer娓叉煋鍒板悇鑷殑RenderingSurface琛ㄩ潰涓婏紝榪欓噷瑕佹敞鎰忕殑鏄茍涓嶆槸娓叉煋鍒板睆騫曚笂鑰屾槸琛ㄩ潰涓婏紝cegui鍦ㄨ繖閲屼嬌鐢ㄤ簡娓叉煋鍒扮汗鐞嗭紝GL
鐢ㄧ殑鏄痜bo瀹炵幇鐨勩?/p>
娉ㄦ剰RenderingSurface鍙湁涓や釜鏉ユ簮錛屼竴鏄氳繃璁劇疆AutoRenderingSurface灞炴э紝鍙︿竴涓氨鏄疪enderingRoot浜嗭紝RenderingRoot鍙湁涓涓紝鍦╮ender涓紝閫氳繃絎竴涓潵婧愮殑浣?/p>
鐢ㄧ殑鏄痜bo鐨勬覆鏌擄紝鑰岀浜屼釜鏉ユ簮鍒欑洿鎺ユ覆鏌撳埌灞忓箷浜嗐?/p>
鎵鏈夌殑榪欎簺鎵ц瀹屽悗灝卞彲浠ユ覆鏌撳埌灞忓箷浜嗭紝閫氳繃RenderingRoot鎵ц錛屾敞鎰忚繖閲岀殑RenderingRoot涓殑RenderTarget鍜屼箣鍓嶇殑涓嶄竴鏍鳳紝榪欓噷鐢ㄧ殑鏄疧penGLViewportTarget鑰屼笉鏄?/p>
OpenGLFBOTextureTarget銆?br>