Opened 8 years ago

Closed 7 years ago

Last modified 7 years ago

#7742 closed bug (fixed)

SWAP file constantly recreated, takes up alot of space

Reported by: Cypress Owned by: axeld
Priority: normal Milestone: R1/alpha4
Component: Preferences/VirtualMemory Version: R1/Development
Keywords: Cc:
Blocked By: Blocking:
Has a Patch: yes Platform: All

Description

The SWAP file is constantly being recreated at /boot/common/var/swap, regardless if VirtualMemory has the "Enable virtual memory" box checked or not. I have 1,5GB of RAM on my machine (Dell Latitude D820) and a partition of 4.3GB dedicated to Haiku. The SWAP file at /boot/common/var/swap takes up pprox. 3GB of that space. I keep enabling and disabling VirtualMemory, even deleting the file, but the SWAP file keeps reappearing there after a reboot.

If I enable a virtual memory of 257MB, the SWAP file decreases in size:

~> ls -l /boot/common/var/swap

-rw------- 1 user root 269484032 Jun 24 16:05 /boot/common/var/swap

Attachments (3)

swap.diff (796 bytes) - added by kallisti5 7 years ago.
swap-kernel-v1.diff (9.4 KB) - added by kallisti5 7 years ago.
swap-kernel-v2.diff (1.8 KB) - added by kallisti5 7 years ago.

Download all attachments as: .zip

Change History (22)

comment:1 Changed 8 years ago by mmlr

Also see #7550. It appears that the disable option isn't honored at all. If it is the same issue this should be closed as a duplicate.

comment:2 Changed 7 years ago by kallisti5

Version: R1/alpha3R1/Development

same issue seen here:

hrevr1alpha4-44576

  • Installed Haiku to a 8GB partition
  • Reboot to find 400MB free
  • Disk usage shows /boot/common/var/swap is 6.9 GB
  • Machine has a little over 3GB ram... so this makes sense as ram * 2
  • Swap preference panel was already disabled.
  • Erased swap file
  • Emptied trash
  • Space still used
  • Rebooted
  • Space still used
  • No swap file present now
  • Ran checkfs on Haiku partition
    • No errors reported, but space drops to a correct level.
Last edited 7 years ago by kallisti5 (previous) (diff)

comment:3 Changed 7 years ago by kallisti5

Confirmed...

http://cgit.haiku-os.org/haiku/tree/src/system/kernel/vm/VMAnonymousCache.cpp#n1343

Is there a swap setting?

Init it.

Does the swap setting not exist?

size = (off_t)vm_page_num_pages() * B_PAGE_SIZE * 2;

There are several issues with this:

  • The swap space can be very large without taking into account the filesystem size
  • The automatically chosen size is never written anywhere so the swap preference panel isn't aware of it.

I'm seeing if there is a logical way to fix this without breaking anything :)

comment:4 Changed 7 years ago by leavengood

I have several of these VM bugs in my ticket list, I should have worked on them before we started working on the alpha4 release. Because it seems like they might need to be fixed. With the amount of RAM some people can have (such as myself) it is insane to have 16 GB of swap when you have 8 GB of RAM. For one thing it will probably never be used on Haiku, and in general that is way too much swap.

I think the sizing heuristic needs to be just a tad bit smarter ;)

It should have a reasonable maximum, like 2 GB, and it should take into account both the total size of the disk and the available space on that disk. When it has calculated a reasonable size, it should check for the settings file and create it if it doesn't exist and put in the chosen size.

And the initialization code should check the VM settings and delete the swap file if the settings exist and a current swap file exists, but the virtual memory is turned off. That should be inside the if statement on line 1345.

I think if all the above is done most of these bugs will be taken care of.

comment:5 Changed 7 years ago by kallisti5

It should have a reasonable maximum, like 2 GB, and it should take into account both the total size of the disk and the available space on that disk. When it has calculated a reasonable size, it should check for the settings file and create it if it doesn't exist and put in the chosen size.

Yeah, this is definitely a good way to go... however how fast can we do this + testing? I'd like to see this fixed prior to R1A4 as it could impact a large number of users.

Attached is my test patch.. pretty much does what I originally listed and is the "most simple / reliable" solution. Although if you think you could have some smarter checking done before me... i'd say go for it :)

Changed 7 years ago by kallisti5

Attachment: swap.diff added

comment:6 Changed 7 years ago by kallisti5

Has a Patch: set

comment:7 Changed 7 years ago by axeld

I'm not fond of the suggested solution. First of all, the swap file should be enabled by default as Ryan pointed out when there is no settings file.

Second of all, it makes no sense to have a settings file by default, as the size of RAM, and available HD space are not constants. Also, the kernel should not create a settings file for the same reason: move the installation to a new system, and the same heuristic should determine the best swap file size, instead of using whatever else was good at some other point in time (unless the user changes the setting, that is).

The best solution is to have a syscall that returns the current swap file configuration (if there isn't already), and have VirtualMemory always show this. When you change the settings, it will create a settings file that is then honoured by the kernel on the next boot. VirtualMemory should probably have a setting "automatic" which is the default in which case it would delete the settings file.

comment:8 Changed 7 years ago by axeld

This way, it could even determine differences between the settings file, and the current settings (if any), and directly show the "The settings will take effect on next boot".

comment:9 Changed 7 years ago by kallisti5

I'm not fond of the suggested solution.

One thing to consider here is non-iso based (usb stick, hdd) installations... the Haiku boot partition generally has very little space available, so a small (ex. 64-128MB) swap file may result in a near 0 free space situation.

First of all, the swap file should be enabled by default as Ryan pointed out when there is no settings file.

How likely is it that a user will need the swap file on first boot? I can only see edge cases where users would need a swap file on first boot if they had less than 512MB ram.

With SSD's and other flash memory becoming more common, swap space is generally frowned upon. (not that it's a bad thing at all, an in-use system should have swap "just-in case")

Second of all, it makes no sense to have a settings file by default.

This was to give users an example swap file size (ex, the preflet shows the swap set to 128MB, and the swap file disabled)

To be honest, it really doesn't matter to me how it's implemented... I was just trying to get a solution to a problem that in was R1A3 complete before R1A4. We can take into account a ton of different metrics here, however the more metrics we check the more likely bugs will be :)

This doesn't have to be the final solution, just a solution in the short term.

Either way, I won't commit anything like this without some level of agreeance :P

comment:10 Changed 7 years ago by kallisti5

Ok... here are some ideas for a more long-term fix:

  • If swap is undefined (we can call this "automatic" the future)
    • Swap size defaults to (ram * 2)
    • If (ram * 2) is > 25% of the freespace, use the 25% of the free space as swap
      • If 100MB free, largest swap is 25MB
      • If 1GB free, largest swap is 250MB
      • If 10GB free, largest swap is 2.5GB (this is however limited by the (ram * 2))
  • If swap is defined:
    • If swap larger then free space
      • Log this event
      • Set swap to 98% of free space for this boot only.
        • We could have a low disk space notification that would give an overall alert that freespace is low.
Last edited 7 years ago by kallisti5 (previous) (diff)

comment:11 Changed 7 years ago by kallisti5

It should be also said that the "ReadOnly disk? No swap at all" should still apply :)

comment:12 Changed 7 years ago by kallisti5

actually... xyzzy pointed me to a pre-existing solution in #3723 I'm working on a patch using a cleaned up version of hamish's work

comment:13 Changed 7 years ago by kallisti5

cleaned up kernel work is complete. See attached.

Kernel VM: Improve swap file selection

* Heavily based on Hamish Morrison's GCI work with some
  modified logic and cleanup. #3723
* Adds automatic swap as well as user specified swap
* Limits:
  Automatic: (ram * 2) up to 25% of the disk
  User: user specified up to 90% of the disk
* Supports changing the swap disk location

Changed 7 years ago by kallisti5

Attachment: swap-kernel-v1.diff added

comment:14 Changed 7 years ago by kallisti5

Milestone: R1R1/alpha4
Resolution: fixed
Status: newclosed

commited to master in hrev44611 and hrev44612 as it should cover most of the items Axel mentioned.

I'm still working through the gui changes, but those can be tracked in #3723

Current target is R1A4 with a soft approval by the release coordinator

comment:15 Changed 7 years ago by axeld

A few comments:

+	if (swapAutomatic) {
+		swapEnabled = true;
+		swapSize = (off_t)vm_page_num_pages() * B_PAGE_SIZE * 2;
+	}

I would make the default size dependent on the size of memory: if < 1GB *2 is fine, above that, I would think that the same amount as the amount of memory is sufficient.

+	off_t maxSwap = freeSpace;
+	if (swapAutomatic) {
+		// Adjust automatic swap to a maximum of 25% of the free space
+		maxSwap = (off_t)(0.25 * freeSpace);
 	} else {
-		size = (off_t)vm_page_num_pages() * B_PAGE_SIZE * 2;
+		// If user specified, leave 10% of the disk free
+		maxSwap = freeSpace - (off_t)(0.10 * freeSpace);
+		dprintf("%s: Warning: User specified swap file consumes over 90%% of "
+			"the available free space, limiting to 90%%\n", __func__);
 	}

If you don't absolutely need floating point computation, don't use it in the kernel. In this case /4 respectively /10 should do the trick here.

comment:16 Changed 7 years ago by axeld

Besides, why the differentiation between automatic mode and the other one? If the user sets a certain size, it should be respected, no matter if it needs more than 10%. BTW the warning is printed unconditionally which makes no sense.

comment:17 Changed 7 years ago by kallisti5

Axel:

I would make the default size dependent on the size of memory: if < 1GB *2 is fine, above that, I would think that the same amount as the amount of memory is sufficient.

Mostly I was trying to avoid having any "set" numbers. But yeah.. 16GB * 2 seems a little silly. Making the change now

If you don't absolutely need floating point computation, don't use it in the kernel. In this case /4 respectively /10 should do the trick here.

Good point. Re-factoring now

comment:18 Changed 7 years ago by kallisti5

Besides, why the differentiation between automatic mode and the other one? If the user sets a certain size, it should be respected, no matter if it needs more than 10%.

The difference is mostly to try and quell any free space shortage situations. For example, having a swap file set that is larger then the free space available. Instead of just failing, pull the swap space set back leaving a little free space on the disk.

Although you're right once I think through that... getting into that situation would be rough.

BTW the warning is printed unconditionally which makes no sense.

Sigh... good catch. Will remove that bit.

Last edited 7 years ago by kallisti5 (previous) (diff)

Changed 7 years ago by kallisti5

Attachment: swap-kernel-v2.diff added

comment:19 Changed 7 years ago by kallisti5

changes committed in hrev44613

Note: See TracTickets for help on using tickets.