Cpuset dla Linux 2.6
Ostatnio, z ciekawości chciałem przetestować sobie Cupset w Linux kernel 2.6. Standardowo pod PLD jest to wkompilowane w Kernel oraz wspierane (mniej więcej) w RC-scripts. Generalnie Cpusets przydatne jest dla maszyn wieloprocesorowych. Służy do tworzenia wirtualnych procesorów, w których skład może wchodzić dowolna ilość procesorów fizycznych. Następnie, można przypisać wybrany proces do takiego wirtualnego procesora, tak, aby wykonywał się wyłącznie na nim. Potencjalne korzyści wydają się oczywiste:
- przypisanie zasobów konkretnych procesorów dla wybranych usług, tak aby nie zajmowały sobie wzajemnie czasu procesora, eg. apache + mysql
- przypisanie procesów wybranego użytkownika do konkretnego procesora
- etc
Dla mnie ciekawym wydało się zastosowanie numer 1, z uwagi na fakt, iż mam Apache i MySql na tej samej maszynie. Postanowiłem zatem przypisać obie usługi do osobnych grup procesorów. Jako, iż dysponuje maszyną 2 x Intel(R) XEON(TM) CPU 2.20GHz każdej usłudze przypadło po 1 procesorze.
Ogólne wnioski są takie, ze przy 2 procesorach nie warto. Apache zżera o wiele więcej czasu procesora niż MySQL, co skutkuje ciągłym przeciążeniem jednego procesora, i co za tym idzie obniżeniem wydajności. Procesor przypisany dla MySQL jest obciążany w tym czasie na poziomie 20-40%.
Jedyną korzyścią, jaką widzę w tej konfiguracji, jest to, że przy dużym ruchu, Apache nie zablokuje całkowicie maszyny, ponieważ pozostałe usługi będą mogły wykonać się na mniej obciążonym procesorze.
Przy większej ilości procesorów miało by to być może sensowne zastosowanie. Linki:
Konfiguracja:
/etc/sysconfig/system
# Enable cpusets support? CPUSETS=yes
/etc/sysconfig/cpusets/cpuset-0-httpd
# Name of the cpuset NAME=cpuset-0-httpd # list of CPUs in that cpuset CPUS=0 # list of Memory Nodes in that cpuset MEMS=0 # If a cpuset is cpu or mem exclusive, no other cpuset, other than a direct # ancestor or descendent, may share any of the same CPUs or Memory Nodes. # is cpu placement exclusive? CPU_EXCLUSIVE=1 # is memory placement exclusive? #MEM_EXCLUSIVE=1 # #NOTIFY_ON_RELEASE=0 # PIDs of tasks in this cpuset #TASKS= ONBOOT=yes
/etc/sysconfig/cpusets/cpuset-1-mysql
# Name of the cpuset NAME=cpuset-1-mysql # list of CPUs in that cpuset CPUS=1 # list of Memory Nodes in that cpuset MEMS=0 # If a cpuset is cpu or mem exclusive, no other cpuset, other than a direct # ancestor or descendent, may share any of the same CPUs or Memory Nodes. # is cpu placement exclusive? CPU_EXCLUSIVE=1 # is memory placement exclusive? #MEM_EXCLUSIVE=1 # #NOTIFY_ON_RELEASE=0 # PIDs of tasks in this cpuset #TASKS= ONBOOT=yes
Później robimy:
service cpusets start
W katalogu /dev/cpusets powinny pojawić sie dwa katalogi, o nazwach takich jakie podano w opcjach NAME. W następnej kolejności przypisujemy usługi do konkretnych Cpusets, defaultowo robi się to w plikach eg. /etc/sysyconfig/httpd dodając rozumianą przez RC-scripts opcję:
SERVICE_CPUSET="cpuset-0-httpd"
RC-scripts, przypiszą wtedy podczas startu usługi jej proces do wybranego bpuset. W przypadku MySQL to nie działa, skrypt startowy jest napisany w innej konwencji. W tym przypadku standardowo trzeba dodać do /etc/sysconfig/mysql opcję:
SERVICE_CPUSET="cpuset-1-mysql"
i dalej edytować /etc/init.d/mysql, poszukaj poniższy kawałek kodu, i dodaj brakującą linię:
pid=$! echo "$pid" > "/dev/cpuset/${SERVICE_CPUSET}/tasks" sleep 0.1 mysqlstatus "$clusterdir" start # it takes longer for mysqld to start and create pidfile if it has to recover innodb transactions if [ "$MYSQL_STATUS" = "starting" ]; the
Dalej, restart obu usług, cat /dev/cpusets/cpuset-0-httpd/tasks i cat /dev/cpusets/cpuset-1-mysql/tasks - w obu powinny być odpowiednie PIDy procesów, dalej htop i warto sprawdzić, czy faktycznie dany proces trzyma się swojego procesora.





