2018-07-16

使用 WinDbg 查出 Redis OOM - Out of Memory

Session 是網站開發時既方便又相對 Cookie 安全的資料儲存技術,但 Session 弱型別的特性容易造成程式碼可讀性降低,另外 Session 將資料儲存在 server 上的特性也會影響 server 效能

Session 的優劣相信大家心中各有自己的標準,沒有絕對一致的看法,只是以我個人而言近幾年的新專案中已大幅降低了 Session 的使用,主要就是希望可以提高程式碼的可讀性

公司有部份網站使用 Session 來儲存資料,加上希望跨多台機器存取而利用 Redis 來當做儲存媒介,最近公司的大型活動讓 user 來訪數大增,也讓 Redis 用量超出預期而出現錯誤,剛好利用這次機會紀錄一下使用 WinDbg 找到 Redis OOM - Out Of Memory 的過程

2018-07-13

取得 Redis 中指定 key 條件的筆數

公司有個流量很大的 ASP.NET MVC 網站仍在使用 Session,並利用 Redis 來儲存 Session 資訊,而近來的大型活動讓 Redis 壓力倍增,使用的 memory 是活動前的 2-3 倍,於是興起清查 Redis 各式來源使用量的念頭

經過嘗試了幾種做法,對最後解決方式的執行時間還算滿意,順手紀錄一下各種方式的優缺點待日後備查

2018-07-11

使用 HttpClient 出現 ObjectDisposedException ?!

最近某個專案中有個需求需要對 partner 發出 http request,而 user 針對 request 出現 error 時希望加上 retry 機制:重試一次,結果就是這個重試一次的要求讓程式出現預期外的 Exception,立馬來看看我犯了什麼錯吧

2018-07-09

System.IO.FileLoadException : Could not load file or assembly (0x80131040)

前情提要:公司有個專案需要與外部 partner 周期性進行資料交換,是常見的排程作業但 partner 沒有提供測試環境,加上 partner 的 api 環境有鎖定來源 ip,也就是所有的功能開發都需要憑空想像或是透過 production 來 debug XD 雖然不是第一次遇到這種需求,但還是覺得無力感很重呀

不過就是因為這個專案的特殊性才讓我遇到 System.IO.FileLoadException : Could not load file or assembly 問題,當下我花了一陣子才想到原因加上違反正常 CI/CD 流程,特別筆記一下加深印象

2018-06-25

解決無法使用 IIS Manager 及 AppCmd.exe 列出 Worker Processes 的 Request

最近監控 IIS 上的 application 時發現部份 server 無法列出 request queue,以我的經驗一般情況下並不會特別去看 request queue 的內容,一旦需要看就一定有 server 或是 application 警示出現,如果看不到內容對於除錯就少了可以快速定位發生原因的手段,也就增加偵錯的時間

原本以為是 IIS Manager GUI 的問題,改用 AppCmd.exe 來看內容也出現錯誤,就來看看如何解決吧

2018-06-18

WinDbg 設定 symbol file path 的四種方法

有一陣子沒用 WinDbg 來進行偵錯,再次感受到年紀的影響,指令忘得很乾淨XD 當然 WinDbg 的指令對我而言本來就沒有記得很牢,忘得快也是意料中的事,剛好最近用到的機會高一些,每次查指令也滿花時間的,所以趁著連假時間做個紀錄以利之後追查問題可以再加快速度。

首先就來看看如何設定 symbol file path ,雖然 symbol file path 沒有特別設定也可以正常使用,不過每次都重新下載 symbol file 既耗時又浪費網路頻寬,因此透過設定 symbol file path 讓已經下載過的 symbol file 可以重用讓偵錯流程可以再加快,把握時間找出真正的問題

2018-06-16

Docker Push 出現 405 Method Not Allowed 錯誤?!

之前筆記 解決 Docker build pip install fail 提到在練習 Kubernetes 過程中執行 docker build 指令時會出現 pip install fail 的 error,問題發生原因是 docker 的 DNS 解析不正確造成的,解決方式是設定 Docker 的 DNS。

完成 docker build 產生的 image 只會存在執行指令的機器上,除非手動打包 image 至其他 Kubernetes Node 上,否則在執行 Kubernetes 部署時會出現找不到 image 而出現部署失敗的錯誤訊息,但 Kubernetes Node 可以動態增減,手動複製並沒有真正解決問題,透過將 image push 至 registry 才可以一勞永逸,只是想不到一個 docker push 也讓我卡關了XD 就來看看問題發生原因及解決方式吧

解決 Docker build pip install fail

近期工作之餘將部份時間花在學習 Kubernetes 上,過程中嘗試透過 Dockerfile 建立 pyhon application 的 image 來部署至 Kubernetes 中打算用來做一些實際應用情境的演練,原以為會卡在 Kubernetes 的網路設定上,想不到我太過樂觀,連第一步的 Dockerfile 都 build fail,如果沒有 image 更不用提建立 container 及部署至 Kubernetes

因為 Kubernetes 相關知識尚未上手,非常容易踩雷碰壁,為此我還重建了好幾次 VM 來反覆驗證測試,過程中也遇到好幾次 Dockerfile pip install fail 的狀況,每次都要重新查設定方式,於是就來筆記一下囉

2018-06-10

C# 搭配 MongoDB 的連線寫法

最近有個新專案需要儲存 json 格式的資料,MongoDB 是考慮的選項之一,評估的過程中才發現我沒有 C# 連線 MongoDB 的使用筆記,雖然專案時程非常急迫需求假日額外加班處理,原本很認份地要開工但仔細想想工作畢竟是工作就算再急也不該為了工作失去熱誠,雖說我自己常常額外加班不過都是出於對程式熱誠,一旦只是為了對專案有所交待,我愈來愈說服不了自己,所以決定在休假期間放下時程的考量做自己覺得開心的事

立馬就來紀錄一下 MongoDB 的連線寫法吧

2018-06-07

C# 連線 Oracle 出現 ORA-01000: maximum open cursors exceeded

同事負責的系統在 production 環境出現異常問題:原本系統已經運作了一段時間,某天突然出現 ORA-01000: maximum open cursors exceeded 造成相關功能無法運作,經過 IIS reset 後又可以正常使用,發生頻率不定,只是出現異常的間隔有日趨縮小的現象,造成問題的程式雖然已經找到也完成了修正,但隱含在背後的真正原因還是令我相當好奇,所以多花了不少時間來進行驗證及測試,過程中學到了許多東西一定要好好紀錄才行

2018-06-06

CentOS 7 Docker 無法連線 Docker daemon?!

同事想在 VirtualBox 上建立 CentOS 7 虛擬環境,並在 VM 中使用 Docker,在安裝 Docker 時一如往常相當順利直到實際建立 container 時卻遇到無法連線:Cannot connect to the Docker daemon at unix:///var/run/docker.sock 的提示訊息,重啟 Docker service 時也失敗並得到新的錯誤:Job for docker.service failed because the control process exited with error code.

解決這個問題的過程中學到以前不知道的內容與設定,順手紀錄一下備忘

2018-06-05

如何避免多個 EntityFramework 6 instance 造成資料覆蓋問題 (DB First - Oracle)

之前筆記 如何避免多個 EntityFramework 6 instance 造成資料覆蓋問題 (DB First - SQL Server) 提到 Entity Framework 使用上的限制,也紀錄如何透過在 SQL Server 的 table 上加入 rowversion 的欄位並將 Entity Framework 上該欄位的 Concurrency Mode 改為 fixed 就可以避免修改資料後遭其他人覆寫的狀況,那相同問題當然也會發生在 Oracle 上,就來看看 Oracle 該如何解決吧

2018-05-31

不需安裝 Oracle client 使用 C# 搭配 Oracle.DataAccess 連線 Oracle

之前公司電腦因為註冊檔毀損,讓電腦上的 Oracle client 一直無法正常運作,就算是重灌多次 Oracle client 還是一樣無法正確運作就連移除功能也壞了,所以在 local 開發時我都會暫時將 Oracle.DataAccess 改為 Oracle.ManagedDataAccess,在多數情況下都可以正常運作,真的非得用到 Oracle.DataAccess 就透過 VM 來開發,實際上遇到問題的次數一隻手數得出來,加上近期已經很少用到 Oracle.DataAccess 也就沒有特別想解決 Oracle client 無法正常運作的問題,直到最近有個困擾已久的 issue 一直沒有找到真正原因,透過 LINQPad 模擬時一直搞不定,讓我有了不得不解決的動力

憑心而論,如果沒有其他考量,建議升級為 Oracle.ManagedDataAccess,原生就不需要 Oracle client,如果你還有舊系統的相依無法搞定,就來看看如何可以不安裝 Oracle client 並使用 Oracle.DataAccess 連線吧

2018-05-27

如何避免多個 EntityFramework 6 instance 造成資料覆蓋問題 (DB First - SQL Server)

前後台分離且共同存取 table 或是同時有多台機器甚至是修改資料不經由 EntityFramework 都是平常開發上很常見的情境,但這些操作卻可能因為 EntityFramework 的 cache 機制而出現資料不一致的現象,最近同事疑似遇到類似問題,雖然立馬就想到解決方式,但已經好一陣子沒用,為避免說錯就自己先測試一下並紀錄紀錄囉

要確保資料的完整及一致性,做法有好幾個包括 DB First、Code First、DB table setting 首先就從最簡單的做法:DB First + table setting + SQL Server 看起

讓 log4net 收到指定錯誤 Level 發送 mail

平常我自己本身慣用的 log 套件是 nlog,主要原因是因為設定相對較簡潔,加上多年前看過的效能比較 - Benchmarking 5 popular .NET logging libraries 結果是 nlog 效能較好,不過前陣子看到另一篇文章 - .Netcore之日誌組件Log4net、Nlog性能比較 重新比較 nlog 與 log4net 的效能則得出 log4net 效能較好的結論,所以針對兩者效能問題我想自己動手比較看看,再下結論

在取得效能比較結論前之前,因緣際會下需要調整其他同事的專案,剛好是使用 log4net,所以透過這個機會紀錄一下使用方式

BTW:原本想要大致紀錄一下 log4net 的相關設定及用法,但文件愈看愈多卻也愈搞不清楚設定細節,決定改天有需要時再另外紀錄,今天就只紀錄如何讓 log4net 發出 mail 囉