להבין את ממוצע העומס (Load Average)

בודאי יצא לכם להיתקל באנשי IT או תמיכה פולטים "המכונה עמוסה, תסתכל על ה-Load Average!", או לראות את ה-Load Average על המחשב הביתי שלכם, ולא בדיוק להבין מה משמעות המספרים. אם לא שמעתם על Load Average מעולם, אלה הם אותם שלושה מספרים שמתקבלים כפלט לפקודה "uptime":

$ uptime
 00:46:59 up 15:39,  2 users,  load average: 0.24, 0.12, 0.10

בודאי תהיתם, או ידעתם חלקית מה הם אומרים, ושיש לשים לב אם הם גבוהים מדי, ולחפש את הסיבה, שבודאי מאיטה את המערכת.

אז מה זה בעצם Load Average? ממה מורכבים הערכים? כדי להבין את זה, קודם צריך להבין מה מחזירה הפקודה. שלושת הערכים הם ממוצע העומס בפרקים של דקה, 5 דקות ו-15 דקות בהתאמה.

משתנה העומס מחושב כממוצע התהליכים שהם ברי הרצה (מחכים לזמן CPU), תהליכים שבריצה כרגע ותהליכים שמחכים לסיום פעולת כלשהיא (Uninterpretable sleep), בד"כ פעולת IO (דיסק או רשת). חשוב לדעת, כי לחישוב לא נכנסים כמות המעבדים במערכת. כלומר, שרת עם Load Average של 1, אומר שמעבד אחד (בממוצע) פעיל כל הזמן. בשרת עם מעבד אחד, זו מערכת עמוסה, בשרת עם 4 מעבדים, המערכת עובדת ב-75% (בממוצע כמובן)

מה זה אומר אם יש לשרת Load Average גבוהה? בכלליות, זהו סימן שהשרת לא מצליח להתמודד עם דרישת התהליכים הרצים עליו לזמן CPU. הגורמים יכולים להיות רבים: יותר מדי תהליכים רעבי CPU, יותר מדי IO, למשל בגישה ל-swap ועוד.

כדי ל"אבחן" את סיבת העומס, ניתן להשתמש בפקודה top. רוב המידע שנצטרך נמצא בראש המסך:

top - 08:56:53 up 41 min,  2 users,  load average: 0.09, 0.10, 0.15
Tasks: 166 total,   1 running, 165 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.2%us,  0.9%sy,  0.0%ni, 92.3%id,  3.0%wa,  0.2%hi,  0.4%si,  0.0%st
Mem:   5966228k total,  4111868k used,  1854360k free,    67016k buffers
Swap:  8060924k total,        0k used,  8060924k free,  2916392k cached

באופן כללי, אם הערכים של us או sy גבוהים, המערכת כנראה עמוסה בתהליכים רעבי CPU. במידה והערך wa גבוהה באופן קבוע, כנראה שמערכת עסוקה בהרבה I/O. את המשך האבחון אפשר לעשות בעזרת:

  1. שאר המידע ב-top
  2. כלים כמו iostat, vmstat
  3. ps

על נושא הכלים לניתוח מצב המערכת  ארחיב בפוסט נפרד.

לסיכום, ממוצע העומס במערכת הוא נתון חשוב, שיכול, במבט חטוף, להעיד על מצב בריאות המערכת. זהו נתון ששווה לעקוב אחריו, ולא סתם זהו נתון שרוב מערכות הניטור בודקות כברירת מחדל.

 

 

Posted in linux | Tagged , , | Leave a comment

LDAP: חיפוש objectClass ללא Attribute

לאחרונה נתקלתי בצורך לחפש ב-LDAP של הרבה (יותר מ50K) משתמשים, קבוצה שאין לה attribute מסויים. במקרה הזה, מדובר ב-sAMAcountName (מישהו יכול לנחש את סוג שרת ה-LDAP?)

(&(objectclass=group)(!(sAMAccountName=*)))

(&(objectclass=person)(objectclass=user)(!(objectclass=computer)) \
(!(sAMAccountName=*)))

(שבירת השורה השניה היא לצורך תצודה בלבד)

2 הדוגמאות הנ"ל יחפשו קבוצות (objectClass=group)  או משתמשים (objectClass=person/user), כאשר התוספת של ! לפני sAMAccountName מוסיפה שלילה למשפו חיפוש על ה-Attribute.

השורות הנ"ל הפ בפורמט סטנדרטי של LDAP. שימוש לדוגמא הוא עם הכלי ldapsearch:

ldapsearch -Y GSSAPI '(&(objectclass=group)(!(sAMAccountName=*)))'

שימו לב לשימוש בגרש בודד. שימוש בגרשיים יגרום ל-shell שמדובר ב-& רגיל, ושעליו להריץ את השאילתה (עד ה-&) ברקע.

Posted in Uncategorized | Leave a comment

סידור XML מתוך VIM

מכירים את זה שאתם פותחים קובץ XML, רק כדי לגלות שמי שיצר אותו, לא טרח ליצור קובץ שקריא (עד כמה ש-XML קריא) גם לבני אדם? שורות רציפות, בלי Indentation ומה לא.

אל חשש, vim ו-xmllint לעזרה. הוסיפו את השורה הבאה ל- ~/.vimrc שלכם:

command! Px %!xmllint --format -

ובכל פעם שתפתחו XML סורר, פשוט הקלידו

:Px

ותקבלו XML מפורמט, מסודר וקריא (יותר)

Posted in כללי | Tagged , , | Leave a comment

ביצוע commit לשינוי הרשאה של קובץ ב-subversion

ניסיתם פעם לשנות הרשאה של קובץ, למשל להוסיף הרשאת הרצה לסקריפט בספריה שמנוהלת ע"י SVN? הוא (subversion) לא ישים לב לזה בכלל, ולא יראה זאת כשינוי.

$ chmod u+x file.sh
$ svn status

אז איך קובעים קובץ כבר-הרצה דרך svn?

$ svn propset svn:executable on file.sh
property 'svn:executable' set on 'file.sh'

$ svn status
M file.sh
Posted in כללי | Tagged | Leave a comment

git מעל https עם lighttpd

אני משתמש ב-git כבר לא מעט זמן. בבית עבור פרויקטים אישיים וסתם שמירת קונפיגורציות, בעבודה (הקודמת, עכשיו יש SVN)עבור פרויקטים שונים ומשונים. תמיד הייתי משתמש די ממוצא, בלי merges, branches וכו. את הגיבוי שלי שמרתי בצורת remote repository מבוסס SSH. תמיכה ב-http/s  לא הייתה חשובה לי כל כך עד שהעברתי את השרת שלי ל-amazon, וגישת ssh נעשתה פחות נוחה. בנוסף, רציתי לאפשר גישה נוחה היכן שאין ssh.

עד לגרסה 1.6 של git, תמיכה ב-http הייתה מוגבלת, ונקראה dumb http. השימוש העיקרי שנעשה ב-remote repository היה מעל פרוטוקול native git או ssh. בגרסה 1.7 שופרה הגישה מעל http (ו-https), בעזרת cgi script שנקרא git-http-backend. תפקידו לספק גישה ל-repositories מקומיים(או מרוחקים, תלוי איך מסתכלים על זה).

כברירת מחדל, לא תהיה גישה כלל ל-repositories שלא מכילים את הקובץ "git-daemon-export-ok". ניתן להעביר את משתנה הסביבה GIT_HTTP_EXPORT_ALL לסקריפט בקונפיגורציה של שרת ה-web, ואז תהיה גישה לכל ה-repositories.

אז סביבת העבודה שלי מבוססת micro ec2 instance, debian ו-lighttpd. גישה ל-repository מאופשרת רק מעל https.

כדי להתקין את החבילות הנדרשות יש להריץ את הפקודה

apt-get install lighttpd git apache2-utils

להלן הקונפיגורציה הרלוונטית של lighttpd. טעינת המודולים הרלוונטיים

server.modules = ( "mod_setenv",
                   "mod_rewrite",
                   "mod_cgi" )

כדי לאפשר SSL. אני משתמש בתעודות של CACert

$SERVER["socket"] == ":443" {
    ssl.engine = "enable"
    ssl.pemfile = "/etc/ssl/certs/server.crt"
    ssl.ca-file = "/etc/ssl/certs/ca-chain.pem"
    server.document-root = "/srv/www/"

החלק הבא מאפשר את הגישה ל-repository בעזרת git-http-backend. שימו לב למשתנה GIT_HTTP_EXPORT_ALL, הוא יאפשר גישה לכל ה-repositories. במידה ורוצים לחשוף רק את חלקם, יש להוריד אותו.

    alias.url += ( "/git" => "/usr/lib/git-core/git-http-backend")
    url.rewrite-once = ( "^/git$" => "/git/" )

    $HTTP["url"] =~ "^/git" {
        cgi.assign = ( "" => "" )
        setenv.add-environment = (
            "GIT_PROJECT_ROOT" => "/srv/git",
            "GIT_HTTP_EXPORT_ALL" => ""
        )
    }
}

יש לדאוג שהספריה שבה ישבו ה-git repositories תהיה בבעלות המשתמש אשר מריץ את lighttpd. המקרה שלי, זהו www-data

chown -R www-data.www-data /srv/git

כברירת מחדל, ה-repositories יהיה לקריאה בלבד, כדי לאפשר כתיבה, מאלץ אותנו git-http-backend להזדהות מול השרת. בחרתי להשתמש ב digest, כדי לא לשמור על הדיסק ולשלוח סיסמא שהיא לא hashed.

server.modules += ( "mod_auth" )
auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/lighttpd.user"

auth.require = ( "/git" =>
    (
        "method" => "digest",
        "realm" => "git",
        "require" => "valid-user"
    )
)

כדי לצור את הקובץ lighttpd.user, השתמשתי בפקודה htdigest

htdigest -c /etc/lighttpd/lighttpd.user git myusername

עכשיו ניתן למשוך repository מהשרת, ולבצע  push אליו כדי לסנכרן שינויים.

$ git clone https://myserver.com/git/myrepo
Cloning into myrepo...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
Unpacking objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0)

$ cd myrepo
$ touch newfile
$ git add newfile
$ git commit -m "added new file"
[master 161d975] added new file
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 newfile
$ git push
Username:
Password:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 214 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To https://myserver.com/git/myrepo
   161d975..6040789  master -> master

במידה ורוצים לשמור את שם המשתמש וססמה, כך שלא נתבקש להזין אותו בכל push, ניתן לצור את הקובץ ~/.netrc אשר יכיל שם שרת, משתמש וססמה בצורה הבאה:

machine myserver.com
login myusername
password mypassword

כמובן, לא לשכוח לשנות את ההרשאות של הקובץ .netrc כך שיהיה קריא רק ע"י המשתמש שלכם

chmod 600 ~/.netrc

לא הכי אלגנטי בעולם. שמירת ססמה, בקובץ, בצורה לא מוצפנת זה לא להיט, אבל עושה את העבודה. למי שלא מוכן להתפשר על הנושא, אתם קוראים את הפוסט הלא נכון, חפשו אחד על git מעל SSH (תמצאו אותו כנראה בעתיד הקרוב בבלוג הזה)

זה כל מה נדרש. כעת אפשר לעבור מול ה-repository כמו היה git native או ssh.

Posted in linux | Tagged , , , | Leave a comment

שימוש ב-incron

incron הוא מנגנון, מבוסס inotify, שבדומה ל-cron, מבצע פעולה כאשר הוא מקבל trigger. ב-cron, ה-trigger הוא שעה מסויימת, עבור incron ה-trigger הוא שינוי בקובץ כלשהוא. incron מאפשר "להאזין" לספריה או קובץ, ולבצע פעולה כאשר יש בהם שינוי: הוספת קובץ, מחיקה, עריכה, שינוי הרשאות וכו.

הניהול של icron דומה לניהול של cron, בעזרת הפקודה incrontab ניתן לערוך (בעזרת incrontab -e) את הגדרות עבור כל משתמש, או לשים קבצים ב-/etc/incron.d בפורמט הדומה מאוד ל-cron

אז השם דומה, הניהול כמעט אותו הדבר, לֶמה בכל זאת נשתמש ב-incron? להלן כמה דוגמאות:

  • כאשר רוצים לגרום לשינוי קונפיגורציה לטעון מחדש daemon
  • גיבוי קונפיגורציה אוטומאטי
  • הרצת build בצורה אוטומאטית ברגע שמעתיקים קובץ לספריה (מישהו אמר CI? נושא לפוסט אחר)

כמו בכל כלי unix-י טוב, האפשרויות הן אין סופיות.

הפורמט לכתיבת קובץ incrontab מתואר (ניחשתם נכון) ב man 5 incrontab. אבל אם אפנה אתכם לשם, על מה יהיה לי לכתוב? אז הפורמט של incron הוא די פשוט:


<path> <mask> <command>

כאשר <path> הוא הנתיב עליו יאזין incrond לשינויים, <mask> הוא מספר אשר מתאר את סוג הפעולה שיש להאזין עליה, כאשר ישנן חלופות נוחות יותר בשבילנו בני האדם:


IN_ACCESS File was accessed (read) (*)
IN_ATTRIB Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE File opened for writing was closed (*)
IN_CLOSE_NOWRITE File not opened for writing was closed (*)
IN_CREATE File/directory created in watched directory (*)
IN_DELETE File/directory deleted from watched directory (*)
IN_DELETE_SELF Watched file/directory was itself deleted
IN_MODIFY File was modified (*)
IN_MOVE_SELF Watched file/directory was itself moved
IN_MOVED_FROM File moved out of watched directory (*)
IN_MOVED_TO File moved into watched directory (*)
IN_OPEN File was opened (*)

ו- <command> היא הפקודה שנריץ כאשר יהיה שינוי. לפקודה שנריץ ניתן להעביר פרמטרים בעזרת כמה wild cards שמוגדרים מראש ב-incron


$$ dollar sign
$@ watched filesystem path (see above)
$# event-related file name
$% event flags (textually)
$& event flags (numerically)

להלן כמה דוגמאות:


/etc/lighttpd/conf-enabled IN_CREATE /etc/init.d/lighttpd restart
/etc/passwd IN_ACCESS /usr/local/bin/email-admin "file $@/$# has been accessed"

זהו. נסו ותהנו.

למידע נוסף, ניתן לבקר באתר הבית של הפרויקט

Posted in linux | Tagged , | 2 Comments

הוספת alternative ל-vi – המשך

אחרי הפוסט הקודם על alternatives, הבנתי שיש מקום להרחיב על מנגנון ה-alternatives ב-RHEL\Fedora. בפוסט הקודם דיברתי על איך להוסיף alternative חדש, וכיצד לבחון את מצבו.

עכשיו שיש alternative מוגדר עבור VI, ייתכן ונרצה להחליף אותו לאחת מהאפשרויות האחרות. כדי לבצע שינוי זה יש 2 אפשרויות

  • שימוש ב- set: מאפשר החלפה ל-alternative מסויים, למשל
    sudo alternatives –set vi /bin/vi.minimal
    יחזיר את ההפניה של vi ל-vim-minimal המקורי
  • שימוש ב- config
    sudo alternatives –config vi
    יפתח לנו תפריט קטן שיאפשר בחירה נוחה בין כל האפשרויות הקיימות alternatives –auto

במידה ונרצה להחזיר את ה-alternative למצב ברירת מחדל

  • שימוש ב- auto: כדי להחזיר את ה-alternative לתצורה אוטומאטית, כלומר שימוש במשקל ה-alternative כדי לקבוע את הקישור הפעיל, נשתמש בפקודה:

    sudo alternatives –auto vi 

להלן דוגמה קצרה שמסכמת את הפקודות


$ sudo alternatives --config vi
There are 2 programs which provide 'vi'
Selection Command
-----------------------------------------------
1 /bin/vim.minimal
*+ 2 /usr/bin/vim
Enter to keep the current selection[+], or type selection number: 1
$ alternatives --display vi
vi - status is manual.
link currently points to /bin/vim.minimal
/bin/vim.minimal - priority 100
/usr/bin/vim - priority 200
Current `best' version is /usr/bin/vim.
$ sudo alternatives --auto vi
$ alternatives --display vi
vi - status is auto.
link currently points to /usr/bin/vim
/bin/vim.minimal - priority 100
/usr/bin/vim - priority 200
Current `best' version is /usr/bin/vim.

אגב, מערכת ה-alternatives זמינה גם ההפצות מבוססות דביאן, עם הפקודה update-alternatives. רק שבדביאן, vi הוא alternative בברירת מחדל.

Posted in linux | Tagged , | Leave a comment

הוספת alternative ל-VI

לפני שבוע התקנתי פדורה 15 על הלפטופ החדש שלי. כשניסיתי לערוך קובץ XML, התפלאתי לראות ש-Syntax Highlighting לא עובד. גם כאשר ניסיתי ידנית להפעיל highlighting (למרות שהוא מופעל דרך .vimrc) ולקבוע את ה-syntax כ-XML, לא קרה כלום.

לאחר בירור קצר, מסתבר כי כברירת מחדל מותקן vim-minimal, שמפנה ל /bin/vi. אין בעיה חשבתי, אתקין את vim-enhanced, ואקבל את היכולות של vim. לאחר ההתקנה שוב התאכזבתי, vim-enhanced הותקן כ /usr/bin/vim.

שאני אכתוב vim במקום vi לערוך קובץ? זה כמו שפתאום יחליטו במדינת ישראל לנהוג בצד ימן של הכביש. נתרגל בסוף, אבל כמה סבל וכמה תאונות נצטרך לעבור עד שזה יקרה…

הפתרון הקל, אני יודע, הוא פשוט ליצור alias  שיפנה את vi ל-vim. אבל כאיש System, חיפשתי פתרון יותר "מערכתי". למען האמת, מראש התפלאתי שפדורה לא השתמשו ב-alternatives, אז החלטתי לקחת את העניינים לידיים וליישם alternatives ל-vi בעצמי.

מנגנון alternatives מאפשר התקנה של כמה חבילות שמספקות את אותה הפונקציונאליות במערכת, ולנתב ביניהם, בד"כ ע"פי משקל. דוגמה קלאסית היא java. במערכת יכולים להיות מותקנים java-1.6 ו-java-1.5 בו זמנית, כאשר ל-java-1.6 יהיה משקל רב יותר, והוא יופעל כברירת מחדל. כפועל יוצא, בכל פעם מריצים את הפקודה "java", מופנים ע"י symbolic link ל- java-1.6. אז איך מכניסים את vim תחת ניהול של alternatives?

sudo yum install vim-enhanced
sudo mv /bin/vi /bin/vim.minimal
sudo alternatives --install /bin/vi vi /bin/vim.minimal 100
sudo alternatives --install /bin/vi vi /usr/bin/vim 200

אז מה יש לנו פה. הפקודה הראשונה היא כמובן התקנה של vim-enhanced.
בפקודה השניה נזיז את /bin/vi ל- /bin/vim.minimal כדי שנוכל להוסיף אותו כ-alternative עבור /bin/vi.

2 השורות הבאות יוצרות את ה-alternatives, פורמט הפקודה הוא

<alternatives --install <link> <name> <path> <priority>

כלומר, צור alternative חדש, שהנתיב שלו הוא /bin/vi, שמו הוא vi, והקובץ המקורי נמצא ב /usr/bin/vim.minimal, עם עדיפות 100.

לאחר הרצת הפקודות, ניתן להריץ את הפקודה alternatives –display vi כדי לראות את מצב ה-alternative

$ alternatives --display vi
vi - status is auto.
link currently points to /usr/bin/vim
/bin/vim.minimal - priority 100
/usr/bin/vim - priority 200
Current `best' version is /usr/bin/vim.

דוגמאות לכלים נוספים שנמצאים תחת alternatives הם mkisofs, cdrecord, lpr, sendmail

Posted in linux | Tagged , | 8 Comments

התקנת מכונה וירטואלית עם libvirt על שרת ללא מסך

עם הגרסאות החדשות של פדורה\RHEL\Ubuntu (ובעצם כל הפצה מודרנית) מגיע גירסה של virt-manager. למי שלא מכיר, virt-manager הוא כלי ניהול גראפי שמאפשר התקנה של מכונה וירטואלית עם אמולציה של מסך, מקלדת ועכבר. בנוסף, הוא מאפשר ניהול של כל החומרה הקשורה ל-VM, החל בדיסק וכלה בכמות המעבדים שנקצה ל-VM. אבל מה עושים כשצריך להתקין שרת וירטואלי, על מכונה מרוחקת אליה אין גישה פיזית? בשביל זה יש את virt-install

virt-install הוא החלופה הטקסטואלית של virt-manager, הוא מאפשר התקנה של מכונה וירטואלית, דרך שורת הפקודה, בצורה גמישה מאוד.

אז איך מתקינים:


virt-install --name="test" --ram=512 --vcpus=1 --graphics none --disk path=/tmp/test.img,size=5 --network network=default --location=http://example.com/iso --extra-args "console=ttyS0,115200 headless text"

הפקודה הנ"ל, תגרום ליצירת מכונה וירטואלית חדשה, ששמה test (ראה –name="test"), עם מעבד אחד ו-512M של RAM. המכונה הוירטואלית מחוברת לרשת ברירת המחדל (network:default) שמספקת DHCP\NAT ותותקן על דיסק בגודל 5G (ראה –disk path=/tmp/test.img,size=5)

ההתקנה תתבצע מעל הרשת, כך יש צורך בגישה מקומית (אני משתמש ב lighttpd) או מרוחקת (למשל אתר מראה של פדורה) לקבצי ההתקנה. ניתן לבצע גם התקנה מ-ISO מקומי ע"י אמולציה של CDROM, הבעיה שאז לא ניתן להעביר פרמטרים ל-installer  בעזרת extra-args

אפשרות נוספת, במידה ויש גישה מעל VNC למכונה, היא להשתמש באופציה "vnc" תחת "extra-args". אפשרות זו תגרום ל-installer להריץ שרת VNC, ולספק את כתובת ה-IP שניתן להתחבר אליה כדי להמשיך את ההתקנה.

תוספת אחרונה, במידה וכבר מבצעים התקנה מרחוק, ניתן לבצע התקנה אוטומאטית מלאה ע"י שימוש ב-Kickstart

Posted in kvm, virtualization | Tagged , , , | Leave a comment

מכרו אותי

חלק מהעבודה של איש סיסטם, לדעתי, היא לימוד: לימוד של טכנולוגיות חדשות, שיטות חדשות, כלים חדשים ועוד. חלק חשוב של תהליך זה אצלי הוא שמירת המידע לעיון חוזר או קריאה עתידית. אני כבר די הרבה שנים משתמש ב-del.ici.us, לימים delicious.com.

לאחרונה הודיע Yahoo על מכירתה של delicious.com לחברה שבבעלות מיסדי youtube (כאילו שזה אמור להרשים אותי). בהודעתם אומרים Yahoo כי ימשיכו להפעיל את האתר עד "בערך יולי", ואז מבקשים את אישורי להעביר את כל המידע שצברתי, את כל אותם הקישורים ששמרתי במהלך השנים, לחברה החדשה.

מכיוון שעל Yahoo אני לא ממש סומך עם המידע שלי, ואת החברה החדשה אני בכלל לא מכיר, חשבתי לעבור לשירות אחר, או לחלופין, למשהו מקומי.

אשמח לשמוע באיזה תוכנות \ אתרים אתם משתמשים כדי לשמור קישורים חשובים ולגלות קישורים חדשים

Posted in כללי | Tagged , | 5 Comments