for i in `find /proc -maxdepth 1 -type d|xargs -i basename {}`;do echo -n "PID: $i SWAP: ";cat /proc/$i/smaps|fgrep Swap|awk '{s=s+$2}END{print s}';done|sort -k4n
Tuesday, August 5, 2014
Wednesday, July 16, 2014
Bitwise operators in Python
>>> x = 10
>>> y = 6
>>> print "x={x} ({x:08b}), y={y} ({y:08b})".format(x=x, y=y)
x=10 (00001010), y=6 (00000110)
>>> print "x XOR y = {r:d} ({r:08b})".format(r=x ^ y)
x XOR y = 12 (00001100)
>>> print "x OR y = {r:d} ({r:08b})".format(r=x | y)
x OR y = 14 (00001110)
>>> print "x AND y = {r:d} ({r:08b})".format(r=x & y)
x AND y = 2 (00000010)
>>> y = 6
>>> print "x={x} ({x:08b}), y={y} ({y:08b})".format(x=x, y=y)
x=10 (00001010), y=6 (00000110)
>>> print "x XOR y = {r:d} ({r:08b})".format(r=x ^ y)
x XOR y = 12 (00001100)
>>> print "x OR y = {r:d} ({r:08b})".format(r=x | y)
x OR y = 14 (00001110)
>>> print "x AND y = {r:d} ({r:08b})".format(r=x & y)
x AND y = 2 (00000010)
Wednesday, May 7, 2014
Python dict.fromkeys() magic
I just got some magic from python and what to share with the world.
Imagine we have some python code:
Ok. Now lets try to populate new dictionary with some data:
I think you are expecting to get something like:
{'T2': [1, 1, 1, 1, 1], 'T3': [1, 1, 1, 1, 1], 'T1': [1, 1, 1, 1, 1]}
But Nope! You will see this one:
{'T2': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'T3': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'T1': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
The magic comes from fromkeys() function. It seems the function links all dictionary keys to one list object. Lets check it:
140567008377312
140567008377312
Yes, it's true! So be carefully with fromkeys() or use something like:
P.S.
Thanks to Alexey Gusev for this case.
And yes, when we have understood the problem I easily found this discussion on stackoverflow.
Imagine we have some python code:
keys = ("T1", "T2", "T3")
td = dict.fromkeys(keys, [])
print td
{'T2': [], 'T3': [], 'T1': []}Ok. Now lets try to populate new dictionary with some data:
for i in range(0,5): for v in td.itervalues(): v.append(1) print td
I think you are expecting to get something like:
{'T2': [1, 1, 1, 1, 1], 'T3': [1, 1, 1, 1, 1], 'T1': [1, 1, 1, 1, 1]}
But Nope! You will see this one:
{'T2': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'T3': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'T1': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
The magic comes from fromkeys() function. It seems the function links all dictionary keys to one list object. Lets check it:
for k in td.itervalues(): print id(k)140567008377312
140567008377312
140567008377312
Yes, it's true! So be carefully with fromkeys() or use something like:
td = dict((k, []) for k in keys)
P.S.
Thanks to Alexey Gusev for this case.
And yes, when we have understood the problem I easily found this discussion on stackoverflow.
Thursday, October 10, 2013
Simple moving average in RRD
It's quite easy to add simple moving average (SMA) to RRD with rrd PREV function.
PREV allows you to get data from previous time stamp. The magic is that you can run that function on sequences of variables to dig deeper in the past.
Here is SMA from 10 variables, current value and 9 from the past (php template for PNP).
$def[1] .= "DEF:idle=$rrdfile:$DS[3]:AVERAGE " ;
$def[1] .= "CDEF:idle1=PREV(idle), " ;
$def[1] .= "CDEF:idle2=PREV(idle1), " ;
$def[1] .= "CDEF:idle3=PREV(idle2), " ;
$def[1] .= "CDEF:idle4=PREV(idle3), " ;
$def[1] .= "CDEF:idle5=PREV(idle4), " ;
$def[1] .= "CDEF:idle6=PREV(idle5), " ;
$def[1] .= "CDEF:idle7=PREV(idle6), " ;
$def[1] .= "CDEF:idle8=PREV(idle7), " ;
$def[1] .= "CDEF:idle9=PREV(idle8), " ;
$def[1] .= "CDEF:idle_sma=idle,idle1,idle2,idle3,idle4,idle5,idle6,idle7,idle8,idle9,+,+,+,+,+,+,+,+,+,10,/ " ;
PREV allows you to get data from previous time stamp. The magic is that you can run that function on sequences of variables to dig deeper in the past.
Here is SMA from 10 variables, current value and 9 from the past (php template for PNP).
$def[1] .= "DEF:idle=$rrdfile:$DS[3]:AVERAGE " ;
$def[1] .= "CDEF:idle1=PREV(idle), " ;
$def[1] .= "CDEF:idle2=PREV(idle1), " ;
$def[1] .= "CDEF:idle3=PREV(idle2), " ;
$def[1] .= "CDEF:idle4=PREV(idle3), " ;
$def[1] .= "CDEF:idle5=PREV(idle4), " ;
$def[1] .= "CDEF:idle6=PREV(idle5), " ;
$def[1] .= "CDEF:idle7=PREV(idle6), " ;
$def[1] .= "CDEF:idle8=PREV(idle7), " ;
$def[1] .= "CDEF:idle9=PREV(idle8), " ;
$def[1] .= "CDEF:idle_sma=idle,idle1,idle2,idle3,idle4,idle5,idle6,idle7,idle8,idle9,+,+,+,+,+,+,+,+,+,10,/ " ;
Tuesday, July 16, 2013
How to move lv volume from host to host
To move one LVM volume from host A to host B you should create on host B a volume with same size as moving volume from host A.
You can install pv utility to see file transfer progress, rate and etc. Like this:
dd bs=1M if=LVM_HOST_A | pv -brtp | gzip --fast -c | ssh -c arcfour -o Compression=no HOST_B "gzip -d -c | dd bs=1M of=LVM_HOST_B"
And look at lvmsync - it allows you to sync only changes made since LVM snapshot was made.
After creation you can copy data from one volume to another with dd, ssh commands and gzip for speeding it up:
dd bs=1M if=LVM_HOST_A | gzip --fast -c | ssh HOST_B "gzip -d -c | dd bs=1M of=LVM_HOST_B"
To speed it up little more you can turn off compression in ssh (we already have compressed data with gzip) and choose fast cipher by adding -c arcfour -o Compression=no to ssh:
dd bs=1M if=LVM_HOST_A | gzip --fast -c | ssh -c arcfour -o Compression=no HOST_B "gzip -d -c | dd bs=1M of=LVM_HOST_B"
You can install pv utility to see file transfer progress, rate and etc. Like this:
dd bs=1M if=LVM_HOST_A | pv -brtp | gzip --fast -c | ssh -c arcfour -o Compression=no HOST_B "gzip -d -c | dd bs=1M of=LVM_HOST_B"
And look at lvmsync - it allows you to sync only changes made since LVM snapshot was made.
Saturday, May 4, 2013
PostgreSQL PL speed test
I tested four procedure languages for PostgreSQL 9.2: plpgsql, plperl, plpython2u, plperl and plv8 with Fibonacci numbers function. And V8 was the best!
Wednesday, April 10, 2013
HOWTO install phpDaemon on CentOS 6.X
The problem is that I can't find PECL modules and some libs for them in repos (standard + remi) or packages versions was to old for phpdaemon. No yum, no easy updates, only source codes =(
Step 1: Install all necessary for building from source. Remember if you don't use remi as a php repo, remove --enablerepo=remi from yum command below.
yum --enablerepo=remi install php-devel openssl-devel gcc make git
Step 2: Get libevent2 and install it (in my case in /opt/libevent2)
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gztar -xzf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable/
./configure --prefix=/opt/libevent2
make && make install
Step 3: Install PECL modules
pecl install event
Don't forget to set libevent installation prefix [/usr] : /opt/libevent2
pecl install eio
pecl install proctitle-alpha
git clone git://github.com/zenovich/runkit.git
cd runkit/
phpize
./configure --prefix=/opt/runkit
make && make install
Step 4: Install phpdaemon
cd /opt
git clone git://github.com/kakserpom/phpdaemon.git
ln -s /opt/phpdaemon/bin/phpd /usr/bin/phpd
Step 5: Configure phpdaemon for your needs =)
Subscribe to:
Posts (Atom)