Physical Host Metrics in Ceilometer – An Openstack Liberty Tale

This post is about the errors while getting physical machine metrics with ceilometer specifically  Openstack Liberty. Simply errors can be:

– No metrics shown in:

ceilometer meter-list

specifically metrics listed below:

  • compute.node.cpu.frequency
  • compute.node.cpu.idle.percent
  • compute.node.cpu.idle.time
  • compute.node.cpu.iowait.percent
  • compute.node.cpu.iowait.time

Continue reading

SysReq, Raising Elephants Is So Utterly Boring

SysRq keyboard key is very magical. You can perform a safe reboot a locked up computer with this key.

To achieve this remember mnemonics: “Raising Elephants Is So Utterly Boring”

To use SysRq:

  • Press Alt and SysRq (Print Screen) keys at the same time (but do NOT release them)
  • While holding Alt and SysRq keys down, press the key: R, wait few seconds
  • While holding Alt and SysRq keys down, press the key: E, wait few seconds
  • While holding Alt and SysRq keys down, press the key: I, wait few seconds
  • While holding Alt and SysRq keys down, press the key: S, wait few seconds
  • While holding Alt and SysRq keys down, press the key: U, wait few seconds
  • While holding Alt and SysRq keys down, press the key: B, wait few seconds

Computer will reboot now!

Reclaim empty space from, Shrink disk of qcow2 disk file

To reclaim disk space (in other words to shrink disk space) of qcow2 disk file you need to run following steps.

1. Fill guest disk with empty file

This is required since disk does not really hold its configured size, instead it has a sparse file format in creation time. After a while disk gets writes, temporary file creations/deletions that result non zero blocks in qcow2 file which are useless in reality (i.e. temporarily created file and deleted later). So to gain this space we’ll create a file that takes all space available in backing store (here qcow2 file). This file will only contain zeros. That way qemu-img will skip copying zeros and it will only mark the meta-data of zero sequence (for example length of it).

To do this, turn on virtual machine and in virtual machine’s terminal (you can use ssh to connect):

dd if=/dev/zero of=/tempzerofile
 dd will read from /dev/zero and write to /tempzerofile until all disk space is full. Now remove the file:
 rm /tempzerofile

2. Reclaim unused disk space from qcow2 file

Now turn virtual machine off, and run below command in your host machine to reclaim unused space back. Remember this space is marked with zeros and these type of files are called “sparse file”.

qemu-img convert -O qcow2 image.qcow2 shrinked_image.qcow2

where image is the original image whose size is big and we want to shrink it. shrinked_image is the destination image we want to create.

Singleton Design Pattern

Singleton design pattern is well known design pattern which uses a single object to access its methods at all time. Assume that you have a configuration file to read settings from. You are expecting to access various settings from different source files. With singleton you’ll hold a single object in memory and use this object to access its methods.

Sample python code demonstrating singleton is given below:

class Mysingleton():
	#class variable holds singleton object's reference
    s = None
	
	#constructor
    def __init__(self):
        print "this will print only once!!!"
        self._name = None
		#set _name with setter
        self.name = "yuppii"

	#getter
    @property
    def name(self):
        return self._name

	#setter
    @name.setter
    def name(self,n):
        self._name = n

	#static method to get instance
    @staticmethod
    def getInstance():
		#if no object is created before, create new one
        if Mysingleton.s == None:
            Mysingleton.s = Mysingleton()

        return Mysingleton.s


print Mysingleton.getInstance().name
print Mysingleton.getInstance().name
print Mysingleton.getInstance().name
print Mysingleton.getInstance().name
print Mysingleton.getInstance().name
print Mysingleton.getInstance().name

You  should see an output like:

this will print only once!!!
yuppii
yuppii
yuppii
yuppii
yuppii
yuppii

Agile Manifesto

Scrum has been used by Google since 2005. Scrum is widely used agile framework. In short Agile can be described with the following manifesto:

Individuals and interactions,over,processes and tools
Working software,over,comprehensive documentation
Customer collaboration,over,contract negotiation
Responding to change,over,following a plan
Hats off for this manifesto.

look at: agilemanifesto.org for details.

Search packages in debian based distros

You are probably familiar with:

apt-get install <package-name>

command to install new packages to your debian based distro.

You can easily search for a package from command line with the following command:

apt-cache search <package-name>

if you are not completely know package name get little help from grep and pipe (|) combinations. For example if you want to install setup-tools package for python then search can be:

apt-cache search python | grep setup

Then you can install the package.

KVM Offline Backups

I use KVM in my production servers. But there are some critical questions with KVM usage. Backup process of running virtual machines may be top most question of KVM users. Although, there are many other solutions in the literature, I will discuss more defensive method in this article. Before I move on to details of backing-up VMs, I will first mention the building blocks I used in this method.

KVM

This is the hypervisor.  It supports live snapshot which is crucial for backup process.

Snapshots

A Snapshot of a virtual machine holds the state-of virtual machine at the time of snapshot is taken. This state is mainly about hard drive but if live snapshot is the case, VM’s all registers, memory and kernel buffers are stored into the snapshot.

There are two types of snapshots in KVM.  Internal snapshot is stored in virtual machines disk file, for instance if VM’s disk is named centos.qcow2 then snapshot will be saved within centos.qcow2. External shapshot is not saved into VM’s disk namely centos.qcow2. So snapshot is saved to the location specified with the snapshot command.

Both internal and external snapshots supports online (live) and offline (turned-off) backups.

Continue reading

Soket Programlama – 1

İstemci Sunucu Kavramı ve Örnek Tasarımlar

Soket programlama IPC (interprocess communication) mimarisinde sıklıkla tercih edilen metotlardandır. Pek çok uygulama bu kavramı kullanmaktadır. En basitinden internet üzerinden oynanan bir tavla uygulaması soket programlama kullanılarak yapılabilir.

Soket programlama için temel iki kavram olan istemci ve sunucuyu açıklayalım. İstemciden çok sayıda olabilir. Sunucudan bir tane olacaktır. Aslında bu iki kavram benzetmeyle daha kolay anlaşılabilir. Sunucuyu bakkal dükkanı gibi düşünebiliriz. İstemciyi ise müşteriler. İkinci önemli mevzu ise bir iletişimi istemci başlatır, yani sunucu bekler istemci sunucuya gider. Bir programı tasarlarken iki bu kısıt dışında üst seviyede istemci ile sunucuyu ayıran başka birşey yoktur. Şimdi program örnekleriyle en sık bilinenden daha karmaşığa doğru farklı tasarımları açıklayalım.

1. Basit bir HTTP Sunucu:

HTTP sunucu nedir, bir web sayfasını size sunan uygulamadır. Örneğin google.com bir web sunucu üzerinden size sunucu olarak hizmet vermektedir. Yani bakkal dükkanıdır. İstemci ise chrome, firefox veya internet explorer’dır. Evet bu iki kısıta bakalım. Sunucudan 1 tane var (google.com), istemciden çok var (hepimiz). İkinci kısıt ise olayı kim başlatıyor? Biz yani istemci başlatıyor. Dolayısıyla bu tasarım en temel tasarımdır.

2. Tavla uygulaması:

Sunucu tavla uygulamasıdır ve 1 tanedir. Kendi içinde masalar vb. işler için farklı veri yapıları ile bu bilgiyi tutabilir. Neticede 1 tanedir. İstemciler ise oyunculardır. Hangi masaya oturacaklarsa o masaya katılım yaparlar yani birden fazla olabilir ve olayı istemciler başlatıyor. Bu tasarım da standart bir tasarımdır.

3. Web tabanlı ancak web soket kullanmadan yapılan bir sohbet uygulaması:

Bu uygulamada browser’lar istemcidir, kullanıcıların kullandığı internet sayfası ise sunucudur. Bu uygulamada kullanıcılar birbirine şöyle bir akışla mesaj gönderirler:

a) İstemci tarafı: kullanıcı metin kutusunu doldurur, gönder tuşuna basar.
b) Sunucu tarafı: sunucu mesajı alır kime gönderildiğine bakar ve ilgili kullanıcıya gönderir. Tabiki hayır. Sunucu bir bağlantı başlatamazdı hatırlayacak olursanız. Peki istemci kendisine bir mesaj gelince nasıl bu mesajı okuyacak? Tabiki ilgili sunucuya düzenli olarak kendisi (istemci olduğundan) bağlantı açarak bu durumu soracaktır.
c) İstemci web sunucusunı düzenli olarak (örneğin 10 saniyede bir) sorgulayarak yeni bir mesaj olup olmadığını kontrol eder varsa bu mesaj sayfada görüntülenir.

Bu durum tahmin edileceği gibi hiç etkin değildir. Ancak istemci-sunucu yapısı bize böyle bir çözümü tercih edersek bunu yapmamızı zorluyor. Çünkü bir tane olacak olan şey yani sunucu, bağlantı başlatamıyor.

4. Bankacılık uygulaması:

Gelelim biraz daha karmaşık tasarımlara. Bankasınız ve kullanıcılara SMS ile değil de android veya IOS uygulamasını kullandırarak internet sayfanızda giriş yaptırmak istiyorsunuz (maddi sebeplerden dolayı, SMS bedavadan daha pahalıdır). Bu işi istemci-sunucu ile tasarlayalım. Bir de olayın akışını ifade edelim de tasarımdaki zorluğu ortaya koyalım. İlk olarak kullanıcı bankanın internet sayfasına müşteri numarası ve şifresini girecektir. Bu aşamada standart olan neydi? Müşterinin cep telefonuna bir SMS ile ikinci bir şifre daha gelirdi ve bu şifreyide yeni açılan sayfaya girerek internet bankacılığına erişirdik. Ancak SMS yok, cep telefonu var, cep telefonunda da internet var ve internet bankacılığı uygulaması açık. Şimdi müşterinin cep telefonundaki internet bankacılığı uygulamasına bir mesaj gelecek ve müşteri bu mesajdaki “OK” tuşuna basınca herhangi bir ek işlem yapmadan bilgisayardaki internet sayfası asıl internet sayfasını açacak. Evet karmaşık oldu biraz daha açıklayalım.

a) kullanıcının cep telefonununun interneti var ve bankanın interaktif bankacılık uygulaması yüklü ve açık durumdab) kullanıcı bilgisayardan interaktif bankacılık müşteri adı ve şifresini giriyor
c) bu girişten sonra yeni bir sayfa açılıyor ve kullanıcı bu sayfada bekletiliyor
d) kullanıcının cep telefonuna onaylaması veya red etmesi için bir mesaj geliyor.
e) onaylarsa bilgisayarda bekletildiği sayfa geçiliyor ve internet bankacılığına başarılı bir giriş yapılmış oluyor.
=> yani SMS kalktı.

Şimdi soru şu?
Banka sunucu olmalı değil mi, evet. Peki bu yapı nasıl kurulacak?

Şöyle,

banka internet sayfası = sunucu (kaçarı yok, çünkü bakkal dükkanı orası), müşterinin bilgisayarındaki browser istemci (benzer şekilde kaçarı yok)
cep telefonu uygulaması = istemci, karşısındaki uygulama sunucu (iki kısıtı hatırlayalım)

O vakit başka bir soru akla geliyor, sunucu bekleyen taraf ise müşterinin cep telefonuna “onay” veya “red” mesajını nasıl gönderiyor? (3. örnekteki durumu hatırlayalım), Cevap kendi içinde saklı, kullanıcının cep telefonundaki uygulama açılırken sunucuya istemci olarak bağlantı kuruyor. Bu durumda sunucu ile istemci arasında bir bağ kuruldu ve artık sunucu istemciye mesaj gönderebilir. Hatırlayalım ilk bağlantıyı sunucu kuramaz ama ilk bağlantıdan sonraki bütün iletişimler her iki taraf tarafından tetiklenebilir (bağlantı kapatılmadıktan sonra).

Başka bir soru, internet sayfası ile cep telefonundaki uygulama nasıl ilişkilendirildi? Cevap, internet sayfasına kullanıcı müşteri numarası ile giriş yapıyor, cep telefonundaki uygulama da müşteri numarası ile kayıt yaptırılan bir uygulama.

Dolayısıyla, akışı oynatalım.
1. Cep telefonundan uygulama açılınca sunucuyla bir istemci-sunucu bağlantısı kuruldu (istemci=cep telefonu uygulaması, sunucu=banka uygulaması).

2. İnternet sayfasına bilgisayardan giriş yapıldı. Doğru bilgiler girildiyse cep telefonu sunucu uygulamasına “onay-red” mesajı gönderilecek müşteri bilgisi geçildi (aaaa bakın bu durumda internet sayfası, cep telefonu sunucu uygulamasına istemci olarak bağlanmaktadır, web socket mesela). Tahmin edilebileceği üzere cep telefonu sunucu uygulaması hem müşterilerden hem de banka internet sayfasından bağlantı kabul ediyor olmalı.

3. Cep telefonu sunucu uygulaması kullanıcıya mesaj gönderilir.
4. Müşteri “onay” veya “red” der ve bu mesaj cep telefonu sunucu yazılımına gelir.
5. Cep telefonu sunucu yazılımı internet sayfası istemci soketine (web soket demiştik)  durumu (onay veya red) gönderir.
6. Onay ise internet sayfası gösterilir, red ise çıkış yaptırılır.

Sonuç:

Bu yazımızda istemci-sunucu mimarisine giriş yapıldı ve örnekler verildi. İfade edilen iki kısıt yazılımlarımız için temel teşkil etmektedir. Ağ (network) üzerinden çalışacak yazılımlarda mimari detaylı tasarlanmalıdır.

Soket Programlama – 2

Basit bir Sunucu Yapalım

Bu yazımızda basit bir sunucu yazılımı yapacağız. Bunu temel bazı kavramları yeri geldikçe açıklayarak yapalım. Beklentilerinizin aksine malesef bu sunucu multi-threaded değil single threaded olacaktır. Bu yöntemin seçilmesinin sebebi, asıl amaç olan istemci-sunucu kavramına odaklanılması içindir. Multi-threading kavramını başka bir yazımız için planlayıp konumuza dönelim.

Soket (socket) nedir?

Soket aslında iki ucu boşta olan bir kablo olarak düşünülebilir. Bir bağlantının sağlanması için, bu analoji yapılan kablonun bir ucunun istemciye bir ucunun ise sunucuya bağlı olduğunu düşünecek olursak kablonun her iki uçtaki bağlandığı noktaları soket ile temsil edebiliriz. Yani bir laptop güç kablosu için elektrik soketi = sunucu soketi, dizüstü bilgisayarın güç girişi = istemci soketi denilebilir.

Evet iki yeni kavram ortaya çıktı: İstemci soketi ve sunucu soketi. İstemci soketi bağlantıyı başlatan taraf (bu eğitimin 1. kısmını hatırlayınız ltf), sunucu ise bağlantı gelmesini bekleyen taraf.

Bir not:

Soket programlama için hangi programlama dili ile eğitime devam edeceğimiz hususu geldi çattı. Pek çoğumuz C, Java biliyordur. Açıkçası bunlarla eğitimi sürdürmek oldukça makul gibi gelse de python bence bu kavramları öğrenmek için belki daha rahat bir programlama dili olabilir. Ayrıca harika bir IDE olan pycharm bu iş için biçilmiş kaftan. Community edition’ı indirmediyseniz lütfen durmayın indirin, eğer nesne yönelimli programlamaya (object oriented programming) aşina iseniz daha önce python ile hiç çalışmamış olsanız da bu eğitime devam edebilirsiniz. Evet yanlış ifade etmedim, dili bilmiyorsanız da devam edin! Ek olarak buradaki kavramlar C dili için de geçerlidir. Yani mantık aynıdır, burada ifade edilen kavramlar bir iskelet teşkil etmektedir.

Temel sunucu yazılımı bileşenleri

İlk ihtiyaç duyacağımız bir adet soket. Bu soketi sonradan sunucu soket olması için terfi ettireceğiz.

Şimdi soket oluşturalım

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

AF_INET internet adres ailesinin (address family) kullanılacağını, SOCK_STREAM ise bunun bir TCP soket olduğunu ifade ediyor. TCP = paket iletim garantisi, 3’lü el sıkışma, akış kontrolü… Çok kurcalamadan söylemek gerekirse paketlerimiz bu protokol kullanıldığında iletim garantisi altındadır. Bir de UDP var, UDP’de bu garanti yok. Ancak her garantinin bir maliyeti var, ağ tahmin edeceğiniz gibi sınırsız ve bedava değil. Bu sebeple TCP’nin yerine UDP’nin tercih edilebileceği durumlar (örneğin film izlemek, müzik dinlemek = bir iki paket kaybolsa da mühim değil) varken bunun kabul edilemeyeceği durumlarda (bankacılık uygulaması = para) TCP kullanılmalıdır.
Yukarıdaki kod bir adet TCP kullanan ve internet adres ailesinden bir soket ‘s’ tahsis eder.

Bu soketi şimdi terfi ettirelim

 s.bind('', 9000)

Şimdi, bu kod parçası ne yapıyor? Çoğu internet sayfası TCP 80 port numarasından hizmet vermektedir. SSL ise TCP 443. İşte bind metodu (C de metod = fonksiyon deniyor), ‘s’ soketini 9000 portuna bağlamaktadır. Yani istemci soket 9000 numaralı portun kapısını çalacaktır. Boş geçilen ” tek tırnak aç, tek tırnak kapa ise herhangi bir ağ biriminden (interface) bağlantı gelebilir demektir. Normalde sunucuların birden fazla (4-8 belki daha fazla) ağ birimleri (linuxteki eth0, eth1…) olur. Bu birimlerden hangisinden bağlantı kabul edileceğini ilk parametrede ifade edebilirdik. Evet artık soketin bir ucunu sunucu soket olarak terfi ettirdik. bu aşamadan sonra hatırlayacak olursanız bağlantıyı başlatan değil, bağlantı bekleyen (müşteri bekleyen) soket’idi sunucu soket. Artık bağlantıları bekleyebiliriz.

Kapıyı dinlemeye başlayalım

 s.listen(5)

Malum, sunucu soket olmuştuk bind ile. Sunucu sokete aynı anda birden fazla bağlantı gelebilir. Kaç tane gelmesini arzu ediyorsak (kaynaklarla ilgili bir mevzu) bu sayı listen metod paremetresine yazılır (bu durumda 5). Bu fonksiyonu çağırdıktan hemen sonra linux kullanıcıları netstat -tl komutu ile 9000 portundan bağlantı beklendiğini görebilirler.
Şimdi 9000 portuna gelen bir bağlantı (istemci soketin başlattığı bağlantı) aşağıdaki fonksiyon ile kabul edilir. accept metodu kapıyı çalan müşteriye kapıyı açar. Yani accept çağrılmaz ise bağlantı kabul edilmez.

İçeri buyur edelim

 conn, addr = s.accept()

Bu fonksiyon artık iletişim sağlayabileceğimiz bir kanal açar. Evet konu başında analojisini yaptığımız elektrik kablosunun iki ucu bağlandı. Bu hattın sunucu tarafındaki ucu conn nesnesidir. Aslında conn nesnesi tam olarak bir istemci soketidir. Sunucu soketi şöyle düşünebiliriz. Bir giyim mağazasına girdiniz ve patronun 5 tane (yukarıdaki 5 sayısını hatırlayınız) müşteriyle ilgilenecek müşteri temsilcisi var. accept eder etmez müşteriye bir tane müşteri temsilcisi atıyor. Yani sunucu soket accept ile bir tane istemci soket (conn) üretiyor. Artık sunucu soket devreden çıkıyor ve iki istemci soket yani bağlantıyı başlatan ve sunucu soketten üretilen iki soket konuşmaya (veri alış verişine) başlıyor.
Şimdi soketten müşteri temsilcisi konuşşsun

 conn.send('Merhaba, ben sunucudan tureyen istemci soketim!!!')

Evet, send ile veri gönderebilir, recv ile veri alabiliriz.

Bağlantıyı kapatalım

 conn.close()

Bu TCP bağlantısını koparır. Bu durum kablonun çekilmesi gibidir. Karşı taraftaki istemci soketin de bağlantısı kopar. Burda dikkat edilmesi gereken bir mesele var: conn nesnesi bizim istemci ile olan iletişimimizi sağlayan soket nesnesidir. “s” soketi ise sunucu sokettir. Yani “s” soketine yazma/okuma yapılmamalıdır. İstemci ile olan bütün muhabbetimiz “conn” nesnesi ile yapılmalıdır.

Test edelim ve programın bütün halini görelim

Sunucu yazılımının bütün hali aşağıdadır:

 import socket

 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 s.bind(('', 9000))
 s.listen(5)
 conn, addr = s.accept()
 conn.send('Merhaba, ben sunucudan tureyen istemci soketim!!!')
 conn.close()

Linux kullanıcılarına özel:

netcat (nc) programı ile kodumuzu kolaylıkla test edebiliriz. “nc” bir istemci soket ile belirtilen bir porta aşağıdaki gibi bağlanabilir:

$ nc localhost 9000

nc komutunu çalıştırdığınız ekranda

$ Merhaba, ben sunucudan tureyen istemci soketim!!!

yazısını göreceksiniz.

Windows kullanıcılarına özel:

telnet programı netcat benzeri bir kolaylık sunmaktadır. Telnet ile aynı çıktıyı alacaksınız.

Dikkat:

Netcat’i ikinci kez çalıştırdığınızda bağlanamadığınızı farkettiniz muhtemelen. Bunun sebebi bağlantıyı sonsuz döngü içinde kabul etmememiz. Yani program conn.send(), conn.close() dan sonra bitiyor. Yeni bağlantı için sunucu yazılımının bitmemesi gerekiyor. Peki kod nasıl olmalı? Bir sonraki konuda bu konudaki çeşitli tasarım olasılıklarını ve her bir olasılıktaki sıkıntıları tartışmaya başlayacağız.
Sağlıcakla kalınız.

Sanallaştırma – Virtualbox

Sanallaştırma

Sanallaştırma Bulut Bilişim’in can damarı, yazılımıcının dostu ve öğrenmek için büyük olanaklar veren bir teknolojidir. Sanallaştırma ile fiziksel makinemiz üzerinde değişiklik yapmadan gerçek bir fiziksel makinenin sunduğu hizmetlerin tamamına (hemen hemen) erişilebilmesi mümkündür. Günümüzde Docker gibi teknolojilerle çok daha az yükle bunları başarmak mümkün olsa da sanallaştırma gerçek bir fiziksel makine yerine geçebilen oldukça önemli bir teknolojidir.

Virtualbox, masaüstü sanallaştırması düşünüldüğünde açık kaynak olması, güncellemelerinin sıklıkla yapılması, aralarında Windows’un bulunduğu pekçok işletim sistemi için problemsiz çalışması düşünüldüğünde ilk akla gelen ürünlerdendir. Virtualbox eğer linux dağıtımı kullanıyorsanız paket yöneticisinden, eğer windows işletim sistemi sahibi iseniz virtualbox.org sitesinden indirilip kurulabilir. Kurulum adımlarını yapabildiğinizi varsayarak, virtualbox’ın önemli olduğunu düşündüğümüz farklılıklarını ifade edelim.

Linux Dağıtımları için “dkms”

DKMS (dynamic kernel module support), virtualbox guest additons (virtualbox misafir eklentileri), paketinin işletim sistemi kernel güncellemelerinden sonra kendiliğinden derlenmesi ve kayıt ettirilmesi amacıyla kullanılmaktadır. Virtualbox kurulumunuzdan sonra “kernel” vari mesajlar alıyorsanız dkms paketini yüklemeyi deneyebilirsiniz. Bu probleminiz çözmez ise virtualb0x-dkms adlı bir paket te işinizi çözebilir. Bu paketlerin kurulumundan sonra bilgisayarınızı yeniden başlatmanız gerekebilir.

Misafir Eklentileri (Guest Additions)

Tam bir masaüstü deneyimi sunabilmek için virtualbox misafir eklentileri kurulmalıdır. Bu işlemden sonra entegre fare, kopyala-yapıştır (genellikle metin), ekran kartının çeşitli ek çözünürlükleri gibi gerçekten faydalı özellikler kullanılabilir hale gelecektir.

Birden fazla ekran

Evet virtualbox birden fazla ekranı desteklemektedir. Bu özellikten faydalanmak için misafir eklentilerinin yüklü olduğundan emin olunuz.

Birden fazla CPU

Bu özellik te virtualbox tarafından desteklenmektedir.

Nested Virtualization:

Bu kavram malesef Virtualbox tarafından desteklenmemektedir. Bu kavram ile sanal makinenin kendisi içerisinde sanal makineler oluşturulabilmesi (emulated değil) ifade edilmektedir.