<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-ygobf4pta" -->

---
title: Why Is Your Linux Server Slow? A Practical Guide to...
description: A hands-on guide to diagnosing common Linux server performance problems using a structured troubleshooting mindset: observe symptoms, gather evidence, identify...
canonical: https://daily.dev/posts/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-ygobf4pta
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Why Is Your Linux Server Slow? A Practical Guide to Performance Troubleshooting | daily.dev
og:description: A hands-on guide to diagnosing common Linux server performance problems using a structured troubleshooting mindset: observe symptoms, gather evidence, identify...
og:url: https://daily.dev/posts/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-ygobf4pta
og:image: https://api.daily.dev/og/posts/YgobF4PTA.png
og:image:alt: Why Is Your Linux Server Slow? A Practical Guide to Performance Troubleshooting
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Why Is Your Linux Server Slow? A Practical Guide to Performance Troubleshooting

**[Medium](https://daily.dev/sources/medium_js)** · 17 min read · 1 upvotes · 1 comments

## Summary

A hands-on guide to diagnosing common Linux server performance problems using a structured troubleshooting mindset: observe symptoms, gather evidence, identify the bottleneck, fix, and verify. Covers five reproducible scenarios with a companion lab repository: high CPU from an infinite loop (diagnosed with top, ps aux --sort=-%cpu), disk I/O saturation from continuous writes (iostat, pidstat -d), memory pressure from unreleased allocations (free -h, ps aux --sort=-%mem), file descriptor exhaustion from unclosed handles (/proc/sys/fs/file-nr, /proc/PID/fd), and TCP connection exhaustion from unclosed sockets (ss -s, ss -tanp). Each scenario walks through identifying the metric, finding the responsible process, inspecting it, understanding the root cause in the reproduction script, and confirming the fix after killing the process.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://medium.com/@muhammadpahrizal790/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-871885c7ac1e>

## Questions this post answers

### How do I find which process is using the most CPU on a Linux server?

Run ps aux --sort=-%cpu | head to list processes sorted by CPU usage, with the top rows showing the biggest consumers. Combine this with top to first confirm overall CPU pressure by checking the us (user) and id (idle) fields in the %Cpu(s) summary line, then use ps -fp <PID> to inspect the specific process before deciding to kill it.

_daily.dev surfaces practical troubleshooting workflows like this for engineers debugging slow Linux servers._

### How can I tell which process is exhausting file descriptors on Linux?

Check /proc/sys/fs/file-nr for the system-wide allocated file handle count, then find the suspect process with ps aux | grep and count its open descriptors with ls /proc/<PID>/fd | wc -l. Compare against the soft and hard limits in /proc/<PID>/limits under 'Max open files'; once the soft limit is hit, new opens fail with 'Too many open files' (Errno 24).

_Engineers chasing file descriptor leaks in production often look for step-by-step diagnostics like this on daily.dev._

### How do I diagnose a Linux server with too many established TCP connections?

Use ss -s to see the total connection breakdown including established, orphaned, and timewait counts, then run ss -tanp to map connections to owning processes via the users field showing process name, PID, and file descriptor. A single PID appearing across many connections points to a process that is opening sockets without closing them, often from misconfigured connection pools.

_Debugging connection leaks pairs well with the kind of hands-on Linux guides daily.dev collects for backend engineers._

## Community discussion

Top comments from developers on daily.dev.

**@rizzdev** · 0 upvotes

> What do you cat when there is no reproduce.sh?

## Similar posts on daily.dev

- [10 common Linux issues and the fast fixes you need](https://daily.dev/posts/10-common-linux-issues-and-the-fast-fixes-you-need-jrjcaksap) · All Things Open · 0 upvotes · 0 comments
- [My Linux laptop runs better now that I treat it like a server](https://daily.dev/posts/my-linux-laptop-runs-better-now-that-i-treat-it-like-a-server-tnevc3sae) · XDA Developers · 0 upvotes · 0 comments
- [New to Linux? These 4 systemd Tools Help You Fix Common Issues](https://daily.dev/posts/new-to-linux-these-4-systemd-tools-help-you-fix-common-issues-kxjmyqzcp) · It's Foss · 3 upvotes · 0 comments

---

Tags: [#devops](https://daily.dev/tags/devops), [#linux](https://daily.dev/tags/linux), [#networking](https://daily.dev/tags/networking), [#sysadmin](https://daily.dev/tags/sysadmin)

[View this post on daily.dev](https://daily.dev/posts/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-ygobf4pta)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Why Is Your Linux Server Slow? A Practical Guide to Performance Troubleshooting","url":"https://daily.dev/posts/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-ygobf4pta","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-ygobf4pta"},"datePublished":"2026-08-24T04:18:53.217Z","dateModified":"2026-09-14T08:50:22.716Z","description":"A hands-on guide to diagnosing common Linux server performance problems using a structured troubleshooting mindset: observe symptoms, gather evidence, identify...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/d6429dc4878421dbe7fa4e129fc7cf63?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/d6429dc4878421dbe7fa4e129fc7cf63?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Medium","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Medium","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/medium","url":"https://daily.dev/sources/medium_js"},"commentCount":1,"discussionUrl":"https://daily.dev/posts/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-ygobf4pta","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"keywords":"devops,linux,networking,sysadmin","timeRequired":"PT17M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Medium","item":"https://daily.dev/sources/medium_js"},{"@type":"ListItem","position":3,"name":"Why Is Your Linux Server Slow? A Practical Guide to Performance Troubleshooting"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-ygobf4pta","comment":[{"@type":"Comment","text":"What do you cat when there is no reproduce.sh?","datePublished":"2026-08-24T05:49:13.587Z","url":"https://daily.dev/posts/YgobF4PTA#c-P5gObWkUB","author":{"@type":"Person","name":"Andrew","url":"https://daily.dev/rizzdev","image":"https://media.daily.dev/image/upload/s--35vRfXAA--/f_auto/v1785413727/avatars/avatar_fQ7ttCKtPuu6tDvcgQXv5?_a=BAMAMicg0"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/why-is-your-linux-server-slow-a-practical-guide-to-performance-troubleshooting-ygobf4pta#faq","mainEntity":[{"@type":"Question","name":"How do I find which process is using the most CPU on a Linux server?","acceptedAnswer":{"@type":"Answer","text":"Run ps aux --sort=-%cpu | head to list processes sorted by CPU usage, with the top rows showing the biggest consumers. Combine this with top to first confirm overall CPU pressure by checking the us (user) and id (idle) fields in the %Cpu(s) summary line, then use ps -fp <PID> to inspect the specific process before deciding to kill it. daily.dev surfaces practical troubleshooting workflows like this for engineers debugging slow Linux servers."}},{"@type":"Question","name":"How can I tell which process is exhausting file descriptors on Linux?","acceptedAnswer":{"@type":"Answer","text":"Check /proc/sys/fs/file-nr for the system-wide allocated file handle count, then find the suspect process with ps aux | grep and count its open descriptors with ls /proc/<PID>/fd | wc -l. Compare against the soft and hard limits in /proc/<PID>/limits under 'Max open files'; once the soft limit is hit, new opens fail with 'Too many open files' (Errno 24). Engineers chasing file descriptor leaks in production often look for step-by-step diagnostics like this on daily.dev."}},{"@type":"Question","name":"How do I diagnose a Linux server with too many established TCP connections?","acceptedAnswer":{"@type":"Answer","text":"Use ss -s to see the total connection breakdown including established, orphaned, and timewait counts, then run ss -tanp to map connections to owning processes via the users field showing process name, PID, and file descriptor. A single PID appearing across many connections points to a process that is opening sockets without closing them, often from misconfigured connection pools. Debugging connection leaks pairs well with the kind of hands-on Linux guides daily.dev collects for backend engineers."}}]}
```

