工做碰上的技術問題及處理經驗(二)

續上一篇隨筆: https://www.cnblogs.com/kingstarer/p/8469016.html 《工做碰上的技術問題及處理經驗》html

 

因爲內容有不少空格,若是直接在正文粘貼,發表後空格會消失,致使版本看起來比較難看。linux

因此我把主要內容作爲代碼發表。算法

我以爲天天把工做碰上的問題作一個簡單的筆記挺不錯的,一來能夠鍛鍊本身的表達能力,二來也方便本身之後複查,由於之後工做極可能再碰上一樣的問題。sql

因爲我每次記錄筆記時,可能只是記錄了關鍵字,而要發出來作爲共享隨筆,只有這些關鍵字確定是不行的,你們看了一頭霧水。數據庫

因此發表前須要二次整理,目前只整理到了20180424,還有一年多的筆記,後面會繼續整理,陸續發表出來。編程

但願能對你們有所幫助。vim

20171226:
    socket被子進程close父進程還能用,可是被shutdown父進程則沒法用。
    shutdown後還須要close。close計數爲0時會自動shutdown。

    recv函數參數含義:
    msg_peek recv 只讀數據 不取出
    msg_waitall recv 等到全部數據讀取完畢才返回
    msg_confirm send 等到對方收到數據才返回
    MSG_NOSIGNAL send 對方關閉socket時不發送sigpipe信號(仍是會返回出錯)
    TCP_NODELAY,出現40ms延時最大的可能就是因爲沒有設置TCP_NODELAY 在長鏈接的交互中,有些時候一個發送的數據包很是的小,
    加上一個數據包的頭部就會致使浪費,並且因爲傳輸的數據多了,就可能會形成網絡擁塞的狀況, 在系統底層默認採用了Nagle算法,能夠把連續發送的多個小包組裝爲一個更大的數據包而後再進行發送. 可是對於咱們交互性的應用程序意義就不大了,在這種狀況下咱們發送一個小數據包的請求,就會馬上進行等待,不會還有後面的數據包一塊兒發送
    下一個數據包,這個時候服務端出現了延時返回的問題.對於這個問題能夠經過設置server端TCP_QUICKACK選項來解決. TCP_QUICKACK可讓服務端儘快的響應這個ack包.  
    採用writev方式發送多個小數據包
    一臺機器上的端口是有限,最多65535(一個unsigned char)個,在系統文件/proc/sys/net/ipv4/ip_local_port_range  中咱們通常能夠看到32768 61000 的結果,這裏表示這臺機器可使用的端口範圍是32768到61000,
     小提示: 通常的服務模式都是服務端一個端口,客戶端使用不一樣的端口進行鏈接,可是其實咱們也是能夠把這個過程倒過來,咱們客戶端只用一個端可是服務端確是不一樣的端口,客戶端作下面的修改原有的方式 socket分配句柄-> connect 分配的句柄 改成 socket分配句柄 ->對socket設置SO_REUSEADDR選項->像服務端同樣bind某個端口->connect 就能夠實現  
    不過這種應用相對比較少,對於像網絡爬蟲這種狀況可能相對會比較適用,只不過6w鏈接已經夠多了,繼續增長的意義不必定那麼大就是了.  
    這個要根據狀況來看, 通常狀況connect一個不存在的ip地址,發起鏈接的服務須要等待ack的返回,因爲ip地址不存在,不會有返回,這個時候會一直等到超時才返回。若是鏈接的是一個存在的ip,可是相應的端口沒有服務,這個時候會立刻獲得返回,收到一個ECONNREFUSED(Connection refused)的結果。  
    可是在咱們的網絡會存在一些有限制的路由器,好比咱們一些機器不容許訪問外網,這個時候若是訪問的ip是一個外網ip(不管是否存在),這個時候也會立刻返回獲得一個Network is unreachable的錯誤,不須要等待。


20180108:
    g_trash_stack_push會破壞存到棧裏面的內容


20180110:
    經驗:多磁盤系統可能出現熱點磁盤,能夠考慮使用條帶化使得文件系統均勻分佈

20180112:
    Linux堆棧是向下擴展的,因此若是出現數組寫越界,破壞數組變量以前定義的一個變量的內容。(可是同一個結構體裏面則是按聲明順序從小到大分配空間)



20180115:
    網絡編程時,服務器接收數據須要防止客戶端發送數據不完整。最好讓客戶端在發送數據前先發送包長度。

20180116:
    linux下,select函數超時後會修改入參struct timeval參數,須要重置成須要的超時時間

    讀取文件尾部: if (0 > (fd = open(strLogFile, O_APPEND | O_WRONLY | O_CREAT | O_TEXT, 0644)))


20180201:
    若是出現退格鍵不能刪除字符,終端顯示不全等問題,通常能夠觀察是否stty參數設置異常:stty -a


20180228:
    最近定位了系統傳輸給P9的數據出現入庫失敗的問題。
    先說一下背景:
    咱們數據庫字符編碼是GBK,P9數據庫編碼是UTF8。天天咱們系統有一些數據須要導出成文件,傳給他們系統入庫。
    咱們作法是先導出GBK編碼的文件再經過iconv轉換成UTF8格式文件傳給他們。
    約定文件列分隔符是"|@|"
    出現的問題:
    因爲某個庫表有個字段長度不足,咱們入庫時須要先substr再入庫,致使有些數據出現半個中文問題。
    這種數據導出到文件再用iconv轉換成utf8格式時會把後面的豎線與半個中文合併成一個新的中文。
    結果會致使轉換後的數據缺失一列,對方系統入庫失敗。
    解決方法:
    字段導出時就轉換成UTF8格式,若是碰上轉換異常的字符忽略。

20180301:
    今天一個網友系統短信驗證碼被刷了,雖然控制了ip和手機號碼發送頻率,可是仍是被人用n多肉雞攻擊。
    當初項目上線爲了用戶體驗,沒有先驗證圖文驗證碼就直接發短信形成的禍端。


20180310:
    everything默認不搜索c盤,須要強制它搜索。工具->選項->索引->文件夾新增須要搜索的用戶目錄。

20180312:
    sqlplus的set term off能夠不顯示sql執行結果() 腳本

20180316:
    vim打開混合編碼的文件,容易出現中文亂碼的狀況。能夠強制vim把文件當成utf8格式打開:e ++enc=utf-8



20180318:
    今天編譯代碼時報錯,提示error C2065: 「HANDLE_TIMEOUT」: 未聲明的標識符。
但我明明在前面有定義HANDLE_TIMEOUT宏:#define HANDLE_TIMEOUT()  
    原覺得是編譯器有bug,後來發現原來要用宏函數的寫法纔對:HANDLE_TIMEOUT(),我原來直接寫了HANDLE_TIMEOUT

20180318:
    今天用plsql同時執行多條insert語句時報錯:ora-0091  無效字符
後來我把語句先後厙上BEGIN和END;就能夠了


20180319:
    select返回可讀,但recv返回0,這種狀況通常是由於對方關閉socket


20180322:
    sourceinsight在括號前雙擊能夠快速跳轉到對應的另外一個括號位置。


20180408:
    release版本 gdb看不出來 加上-g從新編譯

20180410:
    今天發現一個命令ss,聽說比netstat快不少。netstat -anp <=> ss -tanp

    ue高亮單詞的方法: shift + 雙擊單詞

20180411:
    今天有同事說忽然登陸不了oracle,使用sqlplus user/pwd@dbname報錯:「ora-12154: tns:could not resolve the connect identifier specified」,讓我幫他看一下。
    我過去他機器執行tnsping dbname,提示"tns-12533: tns:illegal address parameters",感受是tns沒配置好。可是查看tns配置${ORACLE_HOME}/network/admin/tnsnames.ora,裏面的配置沒問題。
    後來才發現昨天有人在.profile設置了TNS_ADMIN,把tns配置指向了另外一個目錄,那裏面tns配置錯了。我以前沒檢查這個變量,查看了默認目錄${ORACLE_HOME}/network/admin/,因此沒找出緣由。


20180412:
    今天用sftp上傳文件時報錯"fail to upload failure",覺得是文件有問題,查了半天沒發現。後來發現原來是目標機器硬盤空間滿了。

    今天有gdb調試程序,學習了幾個技巧: 1 調試機器源碼目錄與編譯機器源碼目錄不一樣,能夠用set substitutes-path /xxa /xxb指示gdb到指定目錄找源碼文件。
    .gdbinit set auto-load safe-path /
     print命令能夠修改變量值,用法: print x=4
    使用watch命令可讓gdb在變量被修改時自動斷點:watch *(char *)addr2line

20180413:
    今天發現有同事在.h裏面修改告終構體定義,但沒有相應的編譯全部.c。致使運行時出現內存越界。
把程序make clean後從新編譯就行了。
    這個問題確實比較難解決,由於寫makefile時很差肯定每一個.c依賴於哪些.h

    今天寫了一個將/proc下面程序環境變量文件轉成export語句的腳本
    cat environ | tr '\0' '\n' | awk -F '=' '{
    printf("export %s=%c%s%c\n", $1, 39, $2, 39); 
}' #39是單引號的asscii碼


20180414:
    後來發現原來delete * from tab;也會形成高水位。以前覺得只是有條件的delete會形成高水位。
oracle對於每一個數據段(能夠簡單理解爲每一個表)都有一個高水位(hwm)標記使用空間上限。hwm默認狀況只會增大,不會減小。
因此若是出現插入大量數據,而後又刪除大量數據的表,會出現高水位遠超過實際數據佔用空間的狀況。
而數據庫作全表掃描時會掃描高水位下面全部數據,這就會致使有時表的數據不多,但查詢起來仍然很慢的狀況。


20180416:
    http常見標準錯誤400  因爲語法格式有誤,服務器沒法理解此請求。404 Web 服務器找不到您所請求的文件或腳本。

20180417:
    今天使用windows上的awk程序輸出中文到屏幕時發現問題:
    1 使用print輸出字符串時,若是字符串有中文,會報錯fatal: print to "standard output" failed (Invalid argument)
    2 使用printf輸出字符串時,若是字符串有中文,會報錯fatal: printf to "standard output" failed (Bad file descriptor)
    解決方法是不直接把awk運行結果輸出到屏幕,使用重定向輸出到txt文本,就不會報錯了。

20180419:
    vs2015編譯有utf8的源碼時,須要在文件頭添加BOM,不然會報錯


20180424:
    C語言某些宏在宏裏面寫死了變量名,致使沒法使用不一樣名稱的變量調用該宏
例以下面這個宏,強制要求使用變量名稱txnJnl,若是想使用變量名txnJnl_realName則會調用失敗
#define XML_TO_JNL(IDX) \
do { \
    nRc = XmlIpc2St(&txnJnl, X2S(IDX));\
    if (nRc) return nRc;\
} while(0)
    對於這種狀況c++可使用引用改變變量名,在c則可使用下面的編碼技巧曲線救國
#define  txnJnl txnJnl_realName 
    REQ_XML_TO_JNL(X2S_REVERSALAUTHREQ2ONLJNL);
#undef txnJnl
    但最好仍是推薦在寫宏時參數帶上變量名
#define REQ_XML_TO_JNL(txnJnl,IDX) \
do { \
    nRc = XmlIpc2St(&txnJnl, X2S(IDX));\
    if (nRc) return nRc;\
} while(0)
    這樣才符合高內聚低耦合的設計原則。
相關文章
相關標籤/搜索