Skip to content

Instantly share code, notes, and snippets.

@ameenkhan07
Last active April 11, 2024 17:02
Show Gist options
  • Save ameenkhan07/4f0a65fb2bdec58656850f09ef8e2c48 to your computer and use it in GitHub Desktop.
Save ameenkhan07/4f0a65fb2bdec58656850f09ef8e2c48 to your computer and use it in GitHub Desktop.
Facebook Production Engineering Interview

What to Expect and Tips

• 45-minute systems interview, focus on responding to real world problems with an unhealthy service, such as a web server or database. The interview will start off at a high level troubleshooting a likely scenario, dig deeper to find the cause and some possible solutions for it. The goal is to probe your knowledge of systems at scale and under load, so keep in mind the challenges of the Facebook environment.
• Focus on things such as tooling, memory management and unix process lifecycle.

Systems

More specifically, linux troubleshooting and debugging. Understanding things like memory, io, cpu, shell, memory etc. would be pretty helpful. Knowing how to actually write a unix shell would also be a good idea. What tools might you use to debug something? On another note, this interview will likely push your boundaries of what you know (and how to implement it).

Design/Architecture 

Interview is all about taking an ambiguous question of how you might build a system and letting you guide the way. Your interviewer will add in constraints when necessary and the idea is to get a simple, workable solution on the board. Things like load and monitoring are things you might consider. What you consider is just as important as to what you don’t. So ask clarifying questions and gather requirements when appropriate.

Troubleshooting and Debugging

  • Analysing Performance, steps involved, and ending.
  • Linux OS performance metrics. Lot of monitoring tools are built on top of these metrics.

Methodoligies

  • provide giudance in choosing the performance tools. Starting point, process and the ending point.
  1. AntiPattern: People tend to run commands they know, not trying to understand what the problem and attacking in solving that instead. (Drunk Man Anti Method) Randomly throwing everything at the problem.
  2. Maybe network, firewall etc
  • Problem Statement Method

    • Why do you think it has a performance problem, is this a new problem or has been there for some time? Something changed recently? Can be expressed in terms of latency, run-time?
  • Workload Characterization Method

    • Who is the causing the load? Why is the load called? What is the load? How the load changed over time?
    • Solve some issues
  • USE Method

    • USE : Utilization, Saturation, Error
    • Functional diagram of the system(listing all componenets of the system), and for every resource check utilization(busy time), saturation(queue length/time), errors(easy to interprate).
    • Current tools might not look everywhere, so this method poses question before the ansers, look at place which are sometimes missed.
  • CPU Analysis

    • Process get deadlocked/blocked, at some point (paging, context switching, network io)
  • CPU Profile Method

    • Flame graph

Tooling

Tool Categories : observability, benchmarking, tuning, static performance tuning, profiling, and tracing
Types of resources : CPU, Memory, IO ie Block Devices(disk) and Network Devices
Types of loads : CPU Bound load, Memory bound load, IO bound load

Observability Tools : Basics

  • uptime

    • Measure of cpu demand by looking at system(CPU + disks) load averages (no of processes running or are waiting to run)
    • Load average - average no of processes that have to wait for CPU time.
    • High Level idea of system usage and how the load changes. 3 numbers -moving load averages at 1, 5, 15 minute.
    • Interpretation : if the load average at 1 min is more than that of 15 min, the load is increasing, or if reverse then load is decreasing. If load is 0.0, then CPU is idle.
    • If load average is greater than no of CPU, meaning more work than what cpu can dispatch. Indicates CPU Saturation
    • Better alternatives : per-CPU utilization - using mpstat -P ALL 1, per-process CPU utilization - top, pidstat
  • dmesg | tail

    • Lists system messages, errors messages related to performance measures can be looked from here
  • vmstat 1

    • summary of servers memory utilization statistics, short for virtual memory stat.
      • r: number of process waiting to run on CPU. Value greater than CPU count means saturation of the server.
      • free : free memory in kilobytes. Alternative, more elaborate, free
      • si, so: Page in and page out (paging~swapping). When pages are written from memory into disk, it is pageout. Page in, when data(process data) is brought from disk to memory, in the forms of pages. Pageins are fine, application initialization will have page-ins. Too many page-out indicate that kernel might be spending too much time managing memeory than application processing (thrashing). In case of constant pageouts, check process occupying cpu the most using ps command. Might be confused as IO problem, since disk are used as memory, and swapping would require r/w from said device.m Swapping can cause a cascading of bad performance since the waiting processes might keep piling on.
      • us, sy, id, wa, st : Percent of CPU times : user time(application), system time (kernel and other system processes), idle(cpu is idle, higher the better), wait I/O, and stolen time. First two indicate that the load may be CPU bound load and looking into the processes in pidstat/top might help in identifying the culprit process(es).

    -Options - 1: every second t: timestamp column, SM: Data in Megabytes

  • mpstat -P ALL 1

    • CPU time breakdowns per CPU(cores) us ing the -P option. One of the cores/CPU overworking indicate high usage of a single threaded app.
    • usr : percentage of cpu utilization while executing user level application
    • sys : percentage of cpu utilization while executing by kernel
  • pidstat 1

    • Summary of per process statistics(breakdown), like top, but doesnt clean the screen. Easy to see patterns over time, rolling output.
    • usr, system for each process.
  • iostat -xz 1

    • Used for devices (hard disks), to understand the workload applied and resulting performance.
    • Workload metrics
      • r/s, w/s, rkB/s, wkB/s : no of reads & writes, no of kB read and written from the attached devices
    • Resulting performance metrics
      • await : avg time for io. Time queued or time being serviced or time waiting for the blocked disk .Larger than expected times might mean device saturation.
      • util : Percentage of time the device is doing work. Interpretation: more than 60 percent indicate device saturation
  • free -m

    • alternate cat /proc/meminfo
    • buffer/cached = sum of buffer and cache. Buffer used for block device io, cache used by virtual page cache.
  • sar -n DEV 1

    • Tool to check network throughput and ensure if it is under the limit. rxKbps and txkBps : measure of workload
  • sar -n TCP,ETCP 1

    • Overview of tcp metrics.
    • active and passive: outbound and inbound connections. Used as measure of network load on the server
  • sar

    • Statistics archive, for CPU, Memory, IO, Network, stores for a month. -A option for all the records
    • By default, sar command shows stats for a day, but using -s -e specific time period of the day could be used
  • top

    • System wide summary. All of above (memory, CPU, IO, network)
    • Consumes cpu to read /proc.
    • % CPU summed across all CPUs.
  • ps

    • Process status listing

Observability Tools : Intermediate

  • strace: System call tracer. Translates syscall args. Usful in solving system usage issues.

    • Implementations of strace use ptrace, alternate use perf using perf-trace. Former slows system down so have to be cautious.
    • Blocks the target, slows application down, Shouldnt be used in production.
  • tcpdump

    • Trace packets. Packets sequences etc. Scalability issue when network is io in high volumes (gigabits). Doesnt scale well.
  • netstat

    • Prints network protocol statistics. Different options provide differ information (interface stats, route table etc)
    • Better command (ip table etc) ss
  • nicstat

    • Network interface stats
  • swapon -s

    • Shows swap device usage
  • lsof

    • Debug tool. Understand env, who is connected to who. Which files are connected to which process.
  • sar

    • System activity reporter. Many statistics (TCP, DEV(networking))
    • Complements top by giving statistics from the past.

Network Issues

  • ethtool
    • Diagnose network links

Sample Examples

Hint : Get a functional diagram of the environement, makes easier to create a check list.


Example 1 : System is slow

  1. start with command top for processes and cpu
  2. Check Disk io (iostat), and network (sar) What to do in such a case : Quantify the problem, is it latency etc. Check system resources with methodologies, run through the checklist.

Example 2: Application Latency is higher. USE METHOD:

  1. top command - Check cpu summary, process/kernel time, cpu utilization (if it is 100 percent or not).
  2. CPU utilization again with vmstat to see paterns. Check memory, if there is enough left and is not leaninig towards saturation point.
  3. mpstat to check if maxing out any cpu
Utilization and saturation metrics: swapping not too much, enough memory left, cpu are not overloaded, cpu time for kernel/application is not too much, r is not a lot more than cpu present.
CPU saturation/utiliation is flexible in case of linux,  kernel manages/moves things around, interrups threads etc if needed. same is not the case with io. 
  1. Check Disk IO utiliation. iostat. util column: more than 60 percent utilization might the problem.
  2. Check Network IO utilization sar -n DEV 1.
  3. pidstat for process wise usage of.

What is inode

It is a datastructure in linux which stores all the info about a file besides its actual name and its contents.

What happens when "No space left on device"

  • Check available memory and it usage using du or df command
    • du -sh / Space used on a particular drive
    • df -h Drive wise split of space usage/availability
  • Reason :
    • Deleted file is already being used by a process and is therefore not released by the kernel. use lsof command to get the process which is causing this problem and restart it.
    • Out of inodes. Inodes are limited for the filesystem. If all of them are used up, you cannot add more files df -i
    • Corrupted filesystem blocks
@elliott2081
Copy link

This is amazing. thanks so much

@helixphoenix
Copy link

Thank you

@perween
Copy link

perween commented Oct 2, 2022

Thank you !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment