If you are a seasoned Windows administrator, then you know that although you can run Windows Server 2003 using an out of the box configuration, it doesn't necessarily mean that you should. Most administrators take the time to optimize their Windows servers to make them run more efficiently. These same principles also apply to Linux Servers. In this article, I will discuss some techniques that you can use to optimize the performance of your Linux Server.
Before I begin
It's no big secret that Linux is a complex operating system consisting of dozens of components. There is no way that I can possibly give you a full-blown discussion of Linux optimization techniques within the constraints of a single article. In fact, entire books have been written on the subject of Linux server optimization. That being the case, I will focus my discussion on how you can understand what components are running on your server, what the impact of those components is, and how to disable unnecessary components. After all, it's impossible to truly optimize a server without having a good understanding of what processes are running on that server.
Reduce the clutter
Although Linux does a convincing job of providing the illusion that applications are running simultaneously, they really aren't. It's physically impossible for a single processor, single-core machine to truly run multiple applications simultaneously. Instead, each of the tasks (threads) that are running on the system is given one or more time slices. This allows the operating system to insure that each thread receives some processor time.
For example, the operating system might allocate 100 milliseconds or so of processor time to each active thread in a round robin fashion. In doing so, processor time is divided among the running threads in a way that gives the illusion that the various processes are running simultaneously.
Being that the operating system must juggle any active threads in a way that insures that each receives enough processor time to keep the machine responsive, it only stands to reason that the fewer threads that are running on the server, the more responsive the system will be. This is because each of the remaining threads will be receiving more processor time because they are no longer competing with the threads that have been terminated.
Stopping unnecessary threads from running will help the operating system to make the best possible use of your server's processor resources, but it is also a good idea from a security stand point. There is a law of computing stating that the larger the code base, the greater the chance that it will contain a security hole. To put it simply, as you decrease the number of threads that are running on a server, you also decrease the potential attack surface.
Now that I have explained how your server can benefit from you turning off any unnecessary threads, you might be wondering how you can figure out which threads are actually running on your server. The process of figuring out what is running on the server is actually fairly simple.
The System Monitor
To do so, you will need to use the System Monitor utility. You can access the System Monitor from the Applications | System Tools menu. If the System Tools option is not present on the System Tools menu, the utility may not be installed. If necessary, you can install the System Monitor by selecting the Add / Remove Applications option from the Applications | System Settings menu. When you do, you will see the Package Management dialog box appear. Scroll through the dialog box until you locate the System section. Select the System Tools check box and click the Update button.
Once the System Monitor has been installed, open it and then select the Process Listing tab. As the name implies, the Process Listing tab lists the various processes that are running on your server.
If you are used to Administering Windows Servers, you are probably familiar with using the Windows Task Manager to display a similar list of processes. The System Monitor's Process Listing tab works similarly to the Windows Task Manager, but you can configure it to provide you with a lot more information than you typically get from Task Manager,
The first thing that you really need to pay attention to is the View drop down list (not to be confused with the View menu). The View drop down list allows you to control which processes the System Monitor displays. Your choices are All Processes, My Processes, and Active Processes. As the name implies, the All Processes tab displays all of the processes that are running on the server at the moment. The Active Processes option display the processes which are actively consuming CPU cycles at the moment.
The My Processes option displays processes related to the operating system, components running on the operating system, and applications that you are running while logged into the server. To put it simply, the My Processes option shows you all of the processes that are running on the server, except for the processes that are being run by other users.
Now that I have talked about the process view, I want to talk about the information that you are given related to each individual process. By default, the process listing tab displays six columns of information related to each individual process; Process Name, User, Memory, X Server Memory, Nice, and ID.
The Process Name field is just that – the name of the process. The unique thing that's really worth mentioning about the Process Name column is that some operating system related processes do not have a name.
As you might expect, the User column displays the name of the user who owns the process. The owner of a process is the user who spawned the process.
The information displayed in the Memory column needs a bit of explaining, so I want to come back to the Memory and X Server Memory columns in a moment. For now, let's move onto the Nice column. The Nice column displays a processes' priority.
Earlier in this article, I mentioned that the operating system assigns slices of processor time to individual threads. A process is simply a collection of one or more threads. The amount of processor time that the threads within a process actually receive depends on the processes' priority. When you assign a priority to a process in Windows, you use values such as Normal, Low, High, and Real Time.
In Linux, priorities are set using a numerical value. The lower a processes' Nice value, the higher the priority that is assigned to the process. A normal Nice value is zero. Therefore, Nice values consisting of negative numbers represent high priority processes, while processes with Nice values consisting of positive numbers have a lower priority. If you are interested in changing a process's priority, you can do so by right clicking on the process and selecting the Change Priority command from the resulting shortcut menu.
The last column displayed by default is the ID column. This column displays the process ID (sometimes called the PID). The PID is a number that uniquely identifies each individual process. The reason why the System Monitor displays the PID for each process is because many of the command line utilities that can be used to interact with individual processes require you to specify the process by PID number. Displaying the PID through the System Monitor just gives you a simple way to look up the PID should you need it.
Now that I have discussed the simpler Process Listing columns, I want to go back and talk about the Memory column that I avoided talking about earlier. The reason why I didn't want to talk about the Memory column earlier is because I think that this column is deceptive. The official description of what the Memory column displays is "The amount of memory that is currently being used by the process". OK, that's great, but as you probably know, there are multiple types of memory at use within the system at a given time. Therefore, a prudent administrator would have to wonder if the Memory column is displaying the process's use of physical memory, virtual memory, a combination of both, something else?
The good news is that it is possible to use the System Monitor to get more detailed information on exactly what type of memory each individual process is using. To do so, select the Preferences command from the System Monitor's Edit menu. When you do, you will see the Preferences properties sheet. If you select the properties sheet's Process Listing tab, you will see that it contains a section called Process Fields. This section displays a list of fields that can be displayed in relation to each process. Most of the available options are not included in the default process listing information.
So let's get back to talking about memory. If you go through the list of Process Fields, you will see that there are quite a few memory related options. The key to understanding how your server's memory is really being utilized is to know the difference between the various memory related fields. The memory related fields that are available to you are: Memory, VM Size, Resident Memory, Shared Memory, RSS Memory, and X Server Memory.
I have already talked about the Memory field, and I briefly mentioned the X Server Memory field earlier. As you have probably already guessed, the X Server Memory field simply displays the amount of X Server memory that the process is using. The other memory related fields are a little more interesting though. Incidentally, the Memory field seems to convey the cumulative total of the VM Size value (which I will talk about in a moment) and the X Server memory. I haven't been able to locate any documentation to confirm this, but the numbers check out on my test server.
The most basic memory related fields are the VM Size field and the Resident Memory field. The VM Size field displays the amount of virtual memory that has been allocated to the process, while the Resident Memory field displays the amount of physical memory that is allocated to the process. The RSS Memory field displays the amount of physical memory that is being used by the process, excluding pages that have been swapped out to virtual memory. The last memory related field that you need to be aware of is the Shared Memory field. Shared memory refers to memory that is allocated to the selected process, but that can also be accessed by another process.
As you can see, there is quite a bit of memory related information that you can get through the System Monitor. If you still want to learn more about the way that a process is using the server's memory, you can right click on the process in question and select the Memory maps command from the resulting shortcut menu.
However, there are also some other useful fields that I have yet to discuss. Two fields of particular importance are the Status and % CPU fields. The Status field shows whether the process is currently running or sleeping. The % CPU field displays the percentage of your server's total available CPU resources that the process is currently using. You can use these two fields in conjunction with each other to help gauge a process's impact on the server.
Removing unwanted processes
At the beginning of this article, I explained that if you really wanted to help your system to run with optimum efficiency, then it is important for you to shut down any unnecessary processes. If you are a Linux expert, then you can probably look at the list of processes within the System Monitor and tell exactly which ones are necessary and which ones aren't. If you are a Windows administrator that is only beginning to delve into the world of Linux though, you may not be able to determine a process's purpose just by looking at its name.
Fortunately, there are some tools available that can help you to figure out what a process is and where it is coming from. The first thing that can help you to figure out a process's purpose is the structured way in which the System Monitor displays the processes. If you are used to working with Windows systems, you might be familiar with the concept of dependencies. In a Windows environment, there are a number of system services that are dependant upon other services. These services cannot start or run unless their dependency service is also running.
Dependencies also exist in Linux, but they are displayed in a completely different manner than that used by Windows. If you look at the System Monitor's View menu, you will notice that there is an option named Process Dependencies that is enabled (by default). What this means is that the System Monitor is displaying processes in a hierarchical manner that reflects dependency processes. As you scroll through the list of processes, you might notice that the listing for some processes is indented. If the listing for a process is indented, then it means that the process is dependent on the process listed above it. If you know what some, but not all of the processes listed do, you can use the way that dependencies are listed to help to figure out which processes are important and can not be shut down.
If you still need help figuring out what a process does, then I recommend going back to the Preferences properties sheet and enabling the Arguments field. The Arguments field displays the command that launched the process. This is helpful because the Argument field usually includes the path to the process's underlying executable file. You can then use the path to figure out what the process is related to. Of course if you are still clueless in regard's to a process's purpose, you can always look it up on the Internet.
Once you are confident that a process can be shut down, I recommend right clicking on the process and selecting the End Process command from the resulting shortcut menu. This will terminate the process, but it gives you a bit of a safety margin in case you make a mistake. You have only stopped the process, you have not taken it out of your system's configuration. Therefore if you should discover that the process was something important, you can restart it by simply rebooting the server or by selecting the Run Application command from the operating system's Actions menu and entering the command listed in the Process's Arguments field.
You might have noticed the Kill Process command on the shortcut menu. The End Process option is the preferred method of stopping a process, but you can tell Linux to kill the process if it becomes stuck and does not want to terminate gracefully.