Deploying mission-critical web applications, high-frequency transaction engines, and distributed microservices across North America requires robust infrastructure backed by deterministic compute, enterprise NVMe storage, and low-latency network interconnects. For infrastructure architects and systems administrators provisioning virtual instances in United States data centers, following an authoritative USA vps configuration guide is essential to transforming standard unmanaged virtual machines into hardened, fault-tolerant, high-performance hosting environments capable of scaling seamlessly under extreme traffic surges.
Operating a high-throughput USA VPS hosting plan involves far more than simply selecting an operating system template. It demands strategic data center placement across primary North American transit hubs, hypervisor-level storage tuning, advanced Linux kernel networking optimizations, robust multi-layer cybersecurity hardening, and precision application server profiling. This comprehensive architectural guide delivers the end-to-end engineering blueprint required to configure, secure, and operate enterprise-grade USA VPS hosting plans for production workloads.
Data Center Geography and Transit: Ashburn, Dallas, and Silicon Valley Network Topology
The physical location of your USA VPS directly governs round-trip network latency (RTT), routing efficiency, and regional user responsiveness. The United States encompasses vast geographical expanses spanning over 3,000 miles from coast to coast. Deploying a single VPS node in an arbitrary location without assessing your primary audience demographics can result in 70ms to 90ms of unnecessary cross-country network latency.
Enterprise hosting architectures primarily cluster around three pivotal Tier-1 transit hubs governed by the American Registry for Internet Numbers (ARIN): Northern Virginia (Ashburn – “Data Center Alley”), North Texas (Dallas – Fort Worth), and Northern California (Silicon Valley / San Jose). Ashburn handles up to 70% of the world’s daily Internet traffic, offering unparalleled transatlantic connectivity to Europe via ultra-high-capacity submarine cable systems (such as MAREA, Dunant, and Amitie) and sub-10ms latency across the US Eastern Seaboard. Dallas provides optimal centralized routing equidistant to both coasts and low-latency transit down into Latin America. Silicon Valley provides direct trans-Pacific fiber landings connecting North America to East Asia and Australia.
In addition to unicast routing, high-availability multi-region architectures frequently leverage BGP Anycast announcements. By announcing the identical public IPv4/IPv6 prefix from Ashburn, Dallas, and San Jose simultaneously, global client DNS queries and ingress HTTP requests automatically route to the topologically nearest USA VPS node via shortest AS-path selection, reducing global latency and isolating regional DDoS attacks to localized data center perimeters.
| US Data Center Hub | Primary Strategic Use Case | Average Latency to NYC | Average Latency to LA | International Transit Gateway |
|---|---|---|---|---|
| Ashburn, VA (US-East) | East Coast commerce, SaaS, European traffic | 5.2 ms – 8.1 ms | 68.4 ms – 74.2 ms | Transatlantic (London, Frankfurt, Paris) |
| Dallas, TX (US-Central) | Nationwide US coverage, Latin American APIs | 31.5 ms – 36.2 ms | 34.8 ms – 39.1 ms | Central & South America (Mexico, Brazil) |
| San Jose, CA (US-West) | West Coast platforms, APAC gateway, Media streaming | 65.8 ms – 72.4 ms | 7.8 ms – 11.2 ms | Trans-Pacific (Tokyo, Sydney, Singapore) |
| Chicago, IL (US-Midwest) | Financial futures, algorithmic trading, Great Lakes | 16.4 ms – 19.8 ms | 48.2 ms – 52.6 ms | Canadian Corridor (Toronto, Montreal) |
When selecting your plan within this USA vps configuration guide, ensure that your provider delivers multi-homed BGP connectivity featuring tier-1 transit carriers (such as Lumen, Arelion, NTT, GTT, and Hurricane Electric) and direct local peering at neutral exchanges like Equinix Ashburn or CoreSite Any2, guaranteeing automatic rerouting during regional carrier fiber cuts.
Hypervisor Resource Provisioning: KVM VirtIO, CPU Pinning, and NVMe Multi-Queue Setup
The foundation of deterministic VPS performance lies in the hypervisor layer. Kernel-based Virtual Machine (KVM) virtualization paired with VirtIO paravirtualized drivers delivers near-bare-metal execution speeds by eliminating the overhead of hardware emulation. In high-performance USA VPS plans, each guest operating system communicates directly with the physical host kernel via shared memory queues.
To eliminate disk I/O bottlenecks during concurrent read and write operations, the virtual storage controller must utilize VirtIO-SCSI with multi-queue support (virtio-scsi-pci). Standard single-queue virtual disks restrict disk operations to a single vCPU thread, creating severe I/O wait states when running multi-threaded databases like PostgreSQL or MariaDB. Multi-queue VirtIO distributes I/O interrupts evenly across all provisioned vCPUs, unlocking the full potential of underlying PCIe Gen4 and Gen5 NVMe storage arrays.
# Verify active VirtIO block drivers and multi-queue interrupt distribution
lsblk -d -o NAME,MAJ:MIN,RM,SIZE,RO,TYPE,MOUNTPOINT,ROTA,SCHED
cat /sys/block/vda/queue/scheduler
# Check multi-queue VirtIO interrupt steering across CPU cores
grep virtio /proc/interrupts | head -n 15
On modern Linux kernels running on enterprise NVMe storage, set the I/O scheduler to none or mq-deadline. Because NVMe drives operate with zero mechanical seek delay and maintain dozens of internal hardware submission queues, complex legacy software schedulers (like CFQ or BFQ) merely introduce unnecessary CPU context-switching overhead.
# Set NVMe I/O scheduler to none for maximum raw throughput
echo "none" > /sys/block/vda/queue/scheduler
# Verify setting persistence in udev rules
echo 'ACTION=="add|change", KERNEL=="vd[a-z]", ATTR{queue/scheduler}="none"' > /etc/udev/rules.d/60-vps-scheduler.rules
udevadm control --reload
In addition, allocating dedicated vCPUs with 1:1 physical thread mapping ensures that compute-heavy routines—such as compiling assets, executing database joins, or running SSL handshakes—never suffer from CPU frequency throttling or time-slice contention with other virtual instances sharing the physical compute chassis.
Similarly, the virtual network interface must utilize multi-queue VirtIO-Net (virtio-net-pci). Enabling multi-queue network drivers creates distinct transmit (TX) and receive (RX) ring queues for each vCPU core. By configuring Receive Packet Steering (RPS) and Receive Flow Steering (RFS), network packet processing is automatically steered across CPU cores, preventing network interface card packet drops during multi-gigabit traffic bursts.
Furthermore, configuring HugeTLB memory pools allocating 2MB hugepages eliminates Translation Lookaside Buffer (TLB) misses during intensive database queries. While Transparent Huge Pages (THP) should be set to madvise to prevent memory fragmentation during Redis background writes, explicitly allocating static hugepages for PostgreSQL or MariaDB yields a consistent 12% to 18% improvement in memory access latency under multi-threaded concurrency.
Base Operating System Hardening: Minimal Images, SSH Keys, and Firewall Configuration
A newly provisioned USA VPS should always start from a minimal operating system installation (Ubuntu 24.04 LTS or AlmaLinux 9) to eliminate bloatware, vulnerable legacy daemons, and unnecessary background services. Securing root access and locking down administrative entry points must be executed before deploying public web workloads.
The initial security configuration sequence enforces key-based SSH authentication with Ed25519 cryptographic curves, relocates the SSH listening port away from port 22 to deflect automated reconnaissance botnets, and establishes a dedicated unprivileged administrative user with strictly monitored sudo privileges.
#!/usr/bin/env bash
# Production Base OS Hardening & User Provisioning Script
set -euo pipefail
NEW_ADMIN="sysops"
# 1. Create unprivileged administrative user with sudo privileges
if ! id -u "${NEW_ADMIN}" >/dev/null 2>&1; then
adduser --disabled-password --gecos "" "${NEW_ADMIN}"
usermod -aG sudo "${NEW_ADMIN}"
echo "${NEW_ADMIN} ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/99-${NEW_ADMIN}"
chmod 0440 "/etc/sudoers.d/99-${NEW_ADMIN}"
fi
# 2. Deploy Ed25519 Public Key
mkdir -p "/home/${NEW_ADMIN}/.ssh"
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGX9z8E7HkProductionDeployKeyAdminVps2026 ${NEW_ADMIN}@usa-vps" > "/home/${NEW_ADMIN}/.ssh/authorized_keys"
chown -R "${NEW_ADMIN}:${NEW_ADMIN}" "/home/${NEW_ADMIN}/.ssh"
chmod 700 "/home/${NEW_ADMIN}/.ssh"
chmod 600 "/home/${NEW_ADMIN}/.ssh/authorized_keys"
# 3. Configure Hardened SSH Daemon
cat << 'EOF' > /etc/ssh/sshd_config.d/99-hardened.conf
Port 2222
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
X11Forwarding no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers sysops
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com
EOF
systemctl restart ssh
echo "Base OS administrative hardening applied successfully."
Immediately after securing SSH, deploy Uncomplicated Firewall (UFW) or NFTables to enforce a default-deny ingress posture. Only explicitly authorized ports (custom SSH 2222, HTTP 80, HTTPS 443) should be permitted to traverse the external interface.
# Enforce UFW default-deny policy
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp comment "Hardened SSH"
ufw allow 80/tcp comment "HTTP Web"
ufw allow 443/tcp comment "HTTPS Web"
ufw allow 443/udp comment "HTTP/3 QUIC"
ufw --force enable
ufw status verbose
Integrating Fail2ban with UFW provides automated real-time perimeter defense: offending IPs that fail SSH authentication three times within ten minutes are immediately banned at the netfilter level for 24 hours.
To further fortify the host operating system against privilege escalation vulnerabilities, blacklisting obsolete file system kernel modules prevents malicious local users from mounting compromised loopback images. Create /etc/modprobe.d/blacklist-filesystems.conf disabling cramfs, freevxfs, jffs2, hfs, hfsplus, and squashfs. Coupling this with strict /tmp and /var/tmp mount options (enforcing nodev, nosuid, and noexec in /etc/fstab) prevents binary execution from temporary writeable scratch spaces, defeating common automated web shell attack scripts.
Linux Kernel Networking Tuning: BBR Congestion Control, Somaxconn, and TCP Sockets
The default Linux networking parameters are calibrated for low-bandwidth local desktop environments, severely throttling network throughput when deployed on multi-gigabit USA VPS hosting plans. Under sustained web traffic, default TCP buffer allocations quickly saturate, leading to dropped connection requests, elevated SYN-cookie generation, and poor Time to First Byte (TTFB).
To eliminate these bottlenecks, create /etc/sysctl.d/99-vps-performance.conf to configure Google’s BBR (Bottleneck Bandwidth and Round-trip propagation time) congestion control algorithm and scale system socket backlogs to handle tens of thousands of concurrent sessions.
# /etc/sysctl.d/99-vps-performance.conf
# High-Throughput Linux Kernel Networking for USA VPS Hosting Plans
# Maximize socket listen backlog for high-volume incoming connections
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 300000
# High-bandwidth TCP socket buffer scaling (supports up to 10Gbps links)
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
# Enable BBR Congestion Control and Fair Queueing
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# TCP connection reuse and port range scaling
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 1024 65535
# Fast Open for reduced round-trip handshake latency
net.ipv4.tcp_fastopen = 3
# Virtual memory swapping policy (preserve RAM for database cache)
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
fs.file-max = 2097152
Activate the kernel parameters immediately by running sysctl -p /etc/sysctl.d/99-vps-performance.conf. Switching from legacy Cubic to BBR congestion control yields up to 300% faster payload transfer speeds across transcontinental United States links that encounter occasional packet loss.
Additionally, tuning TCP window scaling (net.ipv4.tcp_window_scaling = 1) allows the Linux kernel to advertise receive windows greater than 64KB, scaling up to 1GB. On high-bandwidth, high-latency links (such as East-Coast-to-West-Coast routes with 70ms RTT and 10Gbps capacity), large TCP windows are mathematically necessary to saturate the bandwidth-delay product (BDP = Bandwidth × RTT).
High-Performance Web Tier: Nginx Reverse Proxy, FastCGI Microcaching, and TLS 1.3
The web server tier represents the front door of your USA VPS hosting plan. Configuring Nginx as an optimized edge reverse proxy shields backend application servers (PHP-FPM, Node.js, Python WSGI) from slow client connections, provides automated TLS 1.3 encryption, and serves static media directly from kernel page caches.
The following production Nginx configuration demonstrates how to implement non-blocking epoll event loops, fine-tune worker thread affinities, and establish FastCGI microcaching capable of serving thousands of dynamic requests per second with negligible CPU consumption.
# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
events {
worker_connections 8192;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# High-Performance File Streaming
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 10000;
types_hash_max_size 2048;
# FastCGI Microcache Zone Definition
fastcgi_cache_path /var/cache/nginx/microcache levels=1:2 keys_zone=MICROCACHE:64m inactive=60m max_size=512m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
# Gzip Dynamic Compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
# Open File Cache for static media descriptors
open_file_cache max=20000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Pairing Nginx with TLS 1.3 exclusively and configuring Elliptic Curve Cryptography (X25519:secp384r1) ensures that HTTPS handshakes complete in a single round-trip (1-RTT), delivering instantaneous page rendering to US and international visitors alike.
Integrating Google’s Brotli compression alongside Gzip delivers an additional 15% to 25% file size reduction for text-based assets (CSS, JavaScript, JSON, SVG). Smaller payloads transmit faster over mobile networks and conserve expensive egress data transfer allocations on high-traffic production VPS nodes.
Implementing Nginx connection rate limiting via limit_req_zone $binary_remote_addr zone=REQ_LIMIT:20m rate=30r/s; protects sensitive application login endpoints and REST API routes from brute-force authentication attacks. When sudden traffic surges exceed defined burst thresholds, Nginx absorbs bursts gracefully using non-delay queues, guaranteeing reliable responsiveness for legitimate human visitors while throttling rogue automated bots.
Database Sizing and Query Engine Optimization: MariaDB and PostgreSQL
The relational database is typically the primary consumer of system memory and disk I/O on a virtual private server. Running stock MySQL, MariaDB, or PostgreSQL configurations on a multi-core USA VPS results in massive underutilization of available RAM and unnecessary disk thrashing.
For MariaDB / MySQL deployments, configuring the InnoDB buffer pool is the single most impactful tuning step. The buffer pool caches data tables and index pages directly in physical RAM. On an 8GB RAM VPS dedicated to web and database operations, allocating 50% to 60% of total system memory (4GB to 5GB) to the buffer pool ensures that active queries resolve directly from memory without reading from NVMe storage.
# /etc/mysql/mariadb.conf.d/99-vps-tuning.cnf
# Database Memory and I/O Sizing for 8GB USA VPS Plan
[mysqld]
# Memory Allocation
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4
innodb_log_buffer_size = 64M
innodb_log_file_size = 512M
# NVMe Storage and Thread Concurrency
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0 # Disabled for enterprise NVMe SSDs
innodb_flush_method = O_DIRECT # Bypass OS page cache double buffering
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# Connection Management
max_connections = 200
thread_cache_size = 64
table_open_cache = 4000
open_files_limit = 65535
# Query Optimization
tmp_table_size = 64M
max_heap_table_size = 64M
join_buffer_size = 4M
sort_buffer_size = 4M
Setting innodb_flush_neighbors = 0 is essential for SSD and NVMe media, preventing the storage engine from writing adjacent disk sectors simultaneously (a technique originally designed for spinning hard drive heads) and reducing write amplification on flash memory.
For deployments leveraging PostgreSQL instead of MariaDB, configuring shared_buffers = 2GB, effective_cache_size = 6GB, and work_mem = 16MB ensures the cost-based query planner correctly favors indexed memory searches over sequential disk scans. Deploying PgBouncer in transaction pooling mode allows hundreds of ephemeral web workers to share a persistent pool of 25 active database connections, cutting connection overhead to near zero.
Continuous Observability, Automated Snapshot Pipelines, and Cross-Region Disaster Recovery
Maintaining high availability across enterprise USA VPS plans requires proactive telemetry and automated data protection. Relying on manual backups or waiting for customer support tickets to detect outages introduces catastrophic business risk.
Deploying a lightweight Prometheus Node Exporter paired with Grafana provides real-time visualization of CPU core loads, memory utilization, disk IOPS, and network interface bandwidth. Alertmanager rules can be configured to notify DevOps teams via Slack or PagerDuty if disk utilization exceeds 80% or if available memory drops below 500MB.
#!/usr/bin/env bash
# Automated Nightly Snapshot and Off-Site GCS/S3 Replication Script
set -euo pipefail
BACKUP_DIR="/var/backups/vps-system"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
ARCHIVE_NAME="vps_backup_${TIMESTAMP}.tar.gz"
REMOTE_BUCKET="s3://enterprise-vps-backups-us-central"
mkdir -p "${BACKUP_DIR}"
echo "=== Commencing Database Consistent Dump ==="
mysqldump --all-databases --single-transaction --quick --routines --triggers | gzip > "${BACKUP_DIR}/db_${TIMESTAMP}.sql.gz"
echo "=== Archiving Application Code and Configurations ==="
tar -czf "${BACKUP_DIR}/${ARCHIVE_NAME}" \
/etc/nginx \
/etc/ssh \
/etc/sysctl.d \
/var/www/production_app \
"${BACKUP_DIR}/db_${TIMESTAMP}.sql.gz"
# Ship encrypted archive to secondary US geographic region (Ashburn -> Dallas/Central)
echo "=== Replicating to Off-Site Cold Storage Bucket ==="
aws s3 cp "${BACKUP_DIR}/${ARCHIVE_NAME}" "${REMOTE_BUCKET}/${ARCHIVE_NAME}" --storage-class STANDARD_IA
# Clean local backups older than 7 days
find "${BACKUP_DIR}" -type f -name "*.tar.gz" -mtime +7 -delete
find "${BACKUP_DIR}" -type f -name "*.sql.gz" -mtime +1 -delete
echo "Automated off-site disaster recovery backup completed successfully."
Executing nightly database dumps utilizing the --single-transaction flag ensures non-locking, crash-consistent backups while web applications remain fully available to customers. Shipping archives to an off-site object storage bucket in an alternate geographical zone (e.g., from an Ashburn VPS to a Dallas storage vault) guarantees complete disaster recovery capability even in the event of a catastrophic regional datacenter blackout.
Automated backup integrity testing scripts should execute weekly test restorations in an ephemeral sandbox environment, verifying database table consistency and calculating SHA-256 checksums to ensure that disaster recovery archives remain fully viable and corruption-free over long retention cycles.
By enforcing this end-to-end configuration methodology across compute hardware, Linux kernel networking, edge reverse proxies, and relational database engines, systems engineers establish a resilient hosting platform capable of sustained high-throughput performance across all North American enterprise markets.
Frequently Asked Questions
Which US data center region should I choose for my USA VPS hosting plan?
Choose Ashburn, Virginia (US-East) if your primary customer base is on the US East Coast or in Europe, as it offers the densest carrier peering and transatlantic cables. Choose Dallas, Texas (US-Central) for balanced, low-latency nationwide coverage across the entire US and Latin America. Choose Silicon Valley / San Jose (US-West) if serving West Coast users, Australia, or East Asian markets.
What is the performance advantage of KVM virtualization over OpenVZ on a USA VPS?
KVM provides true hardware virtualization with isolated kernel space, allowing you to load custom kernel modules (such as BBR congestion control and kTLS), tune sysctl parameters, assign dedicated non-swappable RAM, and achieve deterministic compute performance without noisy neighbor interference.
Why is BBR congestion control recommended for USA VPS servers?
BBR (Bottleneck Bandwidth and Round-trip propagation time) regulates packet transmission rates based on real-time bandwidth and latency measurements rather than packet loss. Across long transcontinental US distances and overseas fiber routes, BBR achieves up to 3x higher throughput and significantly reduced bufferbloat compared to standard Cubic algorithms.
How does VirtIO-SCSI multi-queue improve NVMe disk throughput?
Standard virtual storage controllers funnel all disk I/O through a single vCPU queue. VirtIO-SCSI multi-queue creates parallel I/O queues mapped to each vCPU core, allowing concurrent database read and write operations to scale linearly across high-performance PCIe Gen4 NVMe storage arrays.
What are the essential SSH hardening steps for a production USA VPS?
Essential steps include disabling root login (PermitRootLogin no), disabling password authentication in favor of Ed25519 SSH keys, changing the default SSH listening port from 22 to a non-standard port (e.g., 2222), restricting allowed ciphers to modern AEAD algorithms, and installing Fail2ban to ban brute-force attackers automatically.
How much RAM should be allocated to the database buffer pool on a VPS?
On a dedicated database server, allocate 70% to 80% of system RAM to the buffer pool (InnoDB buffer pool for MySQL/MariaDB or shared_buffers for PostgreSQL). On a combined server hosting both web and database services, allocate approximately 50% of available RAM to the database buffer pool to leave sufficient memory for Nginx, PHP/Node worker pools, and system page caches.
Why should innodb_flush_neighbors be disabled on NVMe-backed VPS instances?
The innodb_flush_neighbors setting was designed for spinning hard drives to write adjacent dirty pages simultaneously and minimize mechanical head movement. On NVMe SSDs with non-volatile memory chips, adjacent flushing provides zero performance gain and merely causes unnecessary write amplification, shortening drive lifespan.
What is FastCGI microcaching and how does it benefit high-traffic websites?
FastCGI microcaching temporarily caches dynamic HTML responses in memory for very brief periods (e.g., 1 to 5 seconds). During sudden traffic spikes, this allows Nginx to serve thousands of identical requests directly from memory, slashing backend PHP-FPM or database load by up to 90% while keeping content fresh.
How can I achieve zero-downtime disaster recovery for a USA VPS?
Zero-downtime disaster recovery is achieved by taking non-locking crash-consistent database snapshots (–single-transaction), encrypting application code and database dumps, and replicating the archives off-site to a cloud object storage bucket located in a different geographical region (such as East Coast to Central US).
What is the optimal I/O scheduler for NVMe block devices on Linux?
The optimal I/O scheduler for NVMe devices is ‘none’. Because NVMe storage arrays utilize hardware submission and completion queues with no rotational latency, software-level scheduling algorithms (like BFQ or CFQ) add unnecessary CPU processing overhead without improving disk performance.