Set CPU ProcessorAffinity

برای تغییر ProcessorAffinity در حین اجرای برنامه اسم برنامه رو از بخش پراسس ها پیدا کرده و دستور زیر را برای آن اجرا میکنیم :

PS C:\Windows\system32> Get-Process acad | Select-Object ProcessorAffinity

ProcessorAffinity
-----------------
              832

در دستور بالا برنامه اتوکد با نام پراسس acad در دستور مشخص هست خروجی عدد 832 در دستور بالا بستگی به Affinity اون لحظه از برنامه دارد که به صورت دیفالت برای همه رو همه کور های cpu تنظیم شده، عدد 832 بالا تستی است و شامل همه کور ها نیست.

عدد خروجی به تعداد کور و سوکت بستگی دارد اما محاسبات آن به صورت باینری میباشد به صورت زیر :

فرض میکنیم که دو سوکت داریم با هر هر کدام 6 کور که از کور های 0 تا 5 را شامل میشوند.

12 Core Core per Sokcet 6 Socket = 2

حالا برای دو سوکت دوازده جایگاه در نظر میگیریم یعنی از 0 تا 5 و مجددا از 0 تا 5 به شکل جدول ، این دوازده جایگاه درواقع جایگاه های باینری هستند و هر کدام را که 1 قرار داده یعنی آن کور روشن باشد و کار کند و هر کدرم که خاموش باشد یعنی آن کور بی تاثیر است پس اگر مثلا بخواهیم هر دو کور اول هر سوکت را بکار بگیریم باید کور های 0 هر دو سوکت رو 1 در نظر بگیریم که میشود عدد باینری 000001000001 که به دسیمال آن خروجی عدد 65 میشود . میتوان برای تبدیل ها از سایت زیر استفاده کنید :

حالا با توجه به عدد بدست امده از خروجی باینری دستور زیر را اجرا میکنیم :

$Process = Get-Process acad; $Process.ProcessorAffinity=65

در انتهای دستور عدد 65 همان خروجی باینری تبدیل شده به دسیمال ما هست که نشان میدهد که برنامه acad باید با دو کور 0 هر دو سوکت ما کار کند و طبق تصویر مشاهده میکنیم که این امر حاصل شده :

حالا بدیهی هست که اگر بخواهیم همه کور هارو درگیر کنیم باید دوازده جایگاه 1 در نظر بگیریم که عدد باینری 111111111111 میشود که دسیمال آن 4095 هست پس اگر دستور رو با عدد 4095 اجرا کنیم باید خروجی به شکل زیر باشد :

$Process = Get-Process acad; $Process.ProcessorAffinity=4095

مشاهده میشود که حال همه کور های درگیر شده و محاسبات درست است ! 😎 🤓

حالا اگر چند یوزر همزمان یک پراسس رو اجرا کرده بودند تکلیف چیست؟! میتوان با سوئیچ IncludeUserName- پراسس یوزر مورد نظر را فقط تغییر داد به مجموعه دستورات زیر دقت کنید :

Get-Process acad -IncludeUserName

Handles      WS(K)   CPU(s)     Id UserName               ProcessName
-------      -----   ------     -- --------               -----------
   1428     261244     9.75   4944 MABNACO\s.farahani     acad
   1260     249976    29.73  10176 MABNACO\morteza        acad    

Get-Process acad -IncludeUserName | Where-Object UserName -eq MABNACO\morteza | Select-Object ProcessorAffinity

ProcessorAffinity
-----------------
             4095
             
$Process = Get-Process acad -IncludeUserName | Where-Object UserName -eq MABNACO\s.farahani; $Process.ProcessorAffinity=65

در نتیجه دستورات بالا فقط یوزر s.farahani پراسس acad اش به 65 تغییر ProcessorAffinity خواهد داد. چون یوزر morteza هم در حال اجرای پراسس مشابهی هست اما فقط ProcessorAffinity روی کاربر s.farahani اعمال میشود.

Last updated