2014年11月21日

django manual release query objects

之前在寫程式的時間,會在程式當中直接使用django的ORM,但是在查詢大量資料後,發現記憶體被吃完了,原因是如果不是使用網頁的方式執行ORM, 必須自行手動使用 
https://docs.djangoproject.com/en/dev/faq/models/#why-is-django-leaking-memory

from django.db import reset_queries
reset_queries()

來清除query object cache, 使用後,記憶體的使用量就變正常了。

2014年6月4日

MPICH3.1安裝

  • 已成功安裝在Ubuntu 14.04, Gentoo與Mint 16上,大部份機器使用icc/icpc與iort,部份機器使用gcc/gfortran。
  • 所有軟體均安裝在/opt/mpich資料夾下。
安裝步驟:
  1. 下載mpich3.tar.gz至/tmp目錄下並解壓縮
  2. cd /tmp/mpich-3.1/
    ./configure --prefix=/opt/mpich 
  3. make -j4 2
  4. sudo make install (要注意sudo的environment會重設的問題)

設定PATH: 
  • sudo vim /etc/bash.bashrc
  • sudo export PATH="$PATH:/opt/mpich/bin"
  • 確認PATH設定成功:mpicc

設定LDCONFIG:
  • sudo touch /etc/ld.so.conf.d/mpich.conf
  • sudo echo "/opt/mpichbin" >> /etc/ld.so.conf.d/mpich.conf
  • sudo ldconfig
  • 確認ldconfig設定成功:ldconfig -p|grep mpich



sudo的PATH重置問題

sudo在執行的時候預設會重置PATH環境變數
而不是使用root的PATH環境變數.

例.以root帳號開啟終端機(需先修改PATH讓他跟預設不同)
$env
PATH=/root/cbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

$sudo env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

看出差別了嗎?
root帳號有我自己加進去的/root/cbin
而用sudo去執行就沒有,因為他會重置成/etc/login.defs裡面的設定

方法1:在.bashrc設定alias,在sudo時帶入PATH環境變數(僅套用至目前帳號) 
$nano ~/.bashrc
加入以下這行
alias sudo='sudo env PATH=$PATH'

方法2:直接修改login.defs(影響全系統)
$nano /etc/login.defs

在這兩行修改成自己想要的
ENV_SUPATH      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/games

方法3:關閉重置環境變數的設定(影響全系統) 
$visudo
打開sudo設定檔,加入或修改以下這行
Defaults    !env_reset


方法4:設定保留PATH環境變數的設定(影響全系統) 
$visudo
打開sudo設定檔,加入或修改以下這行
Defaults    env_keep = "PATH"

2014年3月13日

snmp安裝,設定

情前提要
再使用網路管理軟體前,需要先取得系統各個資訊,以此為目我們需要安裝一些套件,下列為套件名稱 
  1. snmp 
  2. snmpd
  3. snmp-mibs-downloader

套件介紹
  1. snmp這是一個通訊協定可以取得系統的資訊
  2. snmpd可以透過此套件直接下達指令驗證取得資訊
  3. snmp-mibs-downloader 如果只用上述兩種軟體下達指令,會得到數值排列的訊息,為了更好了解這些數值排列的意思就有所謂的mib套件,就如同IP有DNS一樣的意思

使用的系統
system ubuntu 12.04 LTS

安裝方式
apt-get install snmp snmpd snmp-mibs-downloader

確認後就可直接安裝

確認安裝版本
dpkg -l | grrp snmp


檔案配置
下列為需要配置的檔案
/etc/snmp/snmpd.conf
/etc/snmp/snmp.conf
/etc/default/snmpd

配置方式
/etc/snmp/snmpd.conf
設定snmpd.conf,這是有關連線、監控方式有關,為了簡化操作,我們只配置三行
首先將原始檔案更名,作為備份用
mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bk
建立相同檔名
vi /etc/snmp/snmpd.conf
寫入下列三行
#讓外部是否有連進來的權利,public是關鍵字串,就像是通關密語

rocommunity  public
#設定你的名稱,這裡的名稱不是hostname,是位置
syslocation  varnish
#聯絡人
syscontact  admin@chin.com.tw


/etc/snmp/snmp.conf
這是要設定的是跟mib有關,需要註解一行即可
#mibs :
註解這行是因為要讓snmp抓到的是名稱


/etc/default/snmpd
這裡配置剛剛設定的snmpd.conf,以及可以設定可以連線的網域/網址
可以將原本的 SNMPDOPTS註解掉加入這行

SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid -c /etc/snmp/snmpd.conf  0.0.0.0'

加入也是要了解這些的作用有哪些,主要加入下列一行,加入snmpd.conf 配置檔 ,可存取的來源位置
-c /etc/snmp/snmpd.conf  0.0.0.0

驗證程序
可以透過指令的方式確認是否有啟動snmp 服務

snmpwalk -v 2c -c public localhost system

指令說明
snmpwalk 取得所有SNMP物件
-v 2c 設定版本
-c public 設定通行指令
localhost 位置(ip也可以)
system 以MIB字串方式顯示

2013年12月21日

Gentoo編譯scipy(with intel MKL)

在gentoo安裝好mkl後,依照官方的說明
http://software.intel.com/en-us/articles/numpyscipy-with-intel-mkl
依序安裝numpy, scipy,
在numpy的部份順利完成,但是在scipy的部份,安裝完後使用
import scipy時,出現

ImportError: /usr/lib64/python2.7/site-packages/scipy/sparse/sparsetools/_csr.so: undefined symbol: __intel_sse4_strlen

原因如下,C/C++ 有完整的「編譯 -> 連結 -> 執行」三個階段, 各階段都可能發生 undefined symbol。在解決惱人的 undefined symbol 前, 得先明白整個編譯流程:
  1. 編譯 .c / .cpp 為 .o (object file) 時, 需要提供 header 檔 (用到 gcc 參數 -I)。事實上, 在編譯單一檔案時, gcc/g++ 根本不在意真正的 symbol 是否存在, 反正有宣告它就信了, 所以有引對 header 即可。這也是可分散編譯的原因, 程式之間在編譯成 .o 檔時, 並沒有相依性。
  2. 用 linker (ld 或 gold) 將 *.o 連結成 dynamic library 或執行檔時, 需要提供要連結的 library (用到 gcc 參數 -L 指定目錄位置, 用 -l 指定要連什麼函式庫)。不同於前一步, 此時 symbol 一定要在。
  3. 執行的時候, 會再動態開啟 shared library 讀出 symbol。換句話說, 前一個步驟只是檢查是否有。檢查通過也連結成 executable 或 shared library 後, 若執行時對應的檔案不見了, 仍會在執行期間找不到 symbol。若位置沒設好, 可能需要用 LIB_LIBRARY_PATH 指定動態函式的位置, 但不建議這麼做, 最好在執行 linker 時就指定好位置。
就看 undefined symbol 發生在那個階段, 若是編 object file 時發生, 就是沒和編譯器說 header 檔在那, 記得用 -I 告訴它。若在 linking 時發生, 就要同時設好 -L 和 -l。不過難就難在要去那找 undefined symbol 的出處。

因為我的問題是發生在執行時間,所以屬於第3類。
首先使用nm _csr.so或是objdump -x _csr.so確認連結。

而 __intel_sse4_strlen定義在
/opt/intel/lib/intel64/libirc.so
/opt/intel/lib/intel64/libiomp5.so

#使用ldconfig -p確認mkl設定(需root權限)
#ldconfig -p|grep mkl
 libiomp5.so (libc6,x86-64) => /opt/intel/composerxe/lib/intel64/libiomp5.so
libirc.so (libc6,x86-64) => /opt/intel/composerxe/lib/intel64/libirc.so

#檢查檔案的格式
$file _csr.so

_csr.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

#使用ldd -r查看缺少的symbol
$ldd -r _csr.so

linux-vdso.so.1 =>  (0x00007fff207ff000)
        libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007f3757ffe000)
        libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libstdc++.so.6 (0x00007f3757cf4000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f3757a72000)
        libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libgcc_s.so.1 (0x00007f375785c000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f37574d2000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f37572b5000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f37570b1000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f3756ead000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f37587e8000)
undefined symbol: __intel_sse4_strlen   (./_csr.so)
undefined symbol: _intel_fast_memset    (./_csr.so)
undefined symbol: _intel_fast_memcpy    (./_csr.so)
undefined symbol: __intel_sse4_strncmp  (./_csr.so)
undefined symbol: __intel_sse4_strcpy   (./_csr.so)
undefined symbol: __intel_sse4_strncpy  (./_csr.so)
undefined symbol: __intel_sse4_strcat   (./_csr.so)

解法方法:
首先在編譯scipy時,使用以下的指令:
  1. python setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem  --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem install >>build.log
    將編譯時期的log寫進build.log中
  2. cat build.log|grep _csr.so, 可得到
    c++ -shared build/temp.linux-x86_64-2.7/scipy/sparse/sparsetools/csr_wrap.o -L/usr/lib64 -Lbuild/temp.linux-x86_64-2.7 -lpython2.7 -o build/lib.linux-x86_64-2.7/scipy/sparse/sparsetools/_csr.so
    copying build/lib.linux-x86_64-2.7/scipy/sparse/sparsetools/_csr.so -> /usr/lib64/python2.7/site-packages/scipy/sparse/sparsetools
    由於已知道是linking的時候有問題,所以在scipy目錄下,將上述編譯指令改成:
    c++ -shared build/temp.linux-x86_64-2.7/scipy/sparse/sparsetools/csr_wrap.o -L/opt/intel/lib/intel64 -L/usr/lib64 -Lbuild/temp.linux-x86_64-2.7 -lpython2.7 -lirc -o build/lib.linux-x86_64-2.7/scipy/sparse/sparsetools/_csr.so
  3. 完成編譯後,將編譯完成的檔案拷貝到系統目錄下(需root權限)
    cp build/lib.linux-x86_64-2.7/scipy/sparse/sparsetools/_csr.so /usr/lib64/python2.7/site-packages/scipy/sparse/sparsetools
  4. 全部完成後,使用import scipy.sparses(scipy.stats)來確認問題解決。
除了_csr.so之後,還有幾個檔案_csc.so, _coo.so, _dia.so, _bsr.so, _csgraph都是用上述方法解決。

_bsr.so除了-lirc外,還需加上-lsvml.





2013年12月18日

快速取出matrix diagonal element方法

n = 1000
c = 20
a = np.random.rand(n,n)

a[np.diag_indices_from(a)] /= c # 119 microseconds
a.flat[::n+1] /= c # 25.3 microseconds
 
#取出off diagonal的方法
 np.delete(a, a.ravel()[::n+1])

2013年12月13日

iptables保存


iptables的設定在在每次重開機之後就會消失
所以設定完後可以用iptables-save將設定檔存起來,如:
sudo iptables-save > /etc/iptables-rules


但是存起來之後,他並不會幫你在每次重開機都讀那個檔

所以還要再設定,修改/etc/network/interfaces,最後面加上:
pre-up iptables-restore < /etc/iptables-rules